prepareTransaction, signMessage, or signTypedData.
- ECDSA owners
- Passkey owners
newOwners is the complete target owner set. Existing owners omitted from it are removed.Ordering and signing constraints
- Send exactly one returned recovery call per UserOperation. The recovery validator authorizes one account
executecall, so batching the array is rejected on-chain. - Preserve the returned order and wait for each UserOperation before sending the next. Additions run before threshold changes and removals to keep the validator configuration valid throughout the rotation.
- Pass at least the configured guardian threshold. Every guardian in the
guardiansarray is asked to sign. - Recovery is complete only after the final call lands. Old and new owners can both remain valid during the sequence.
- If a call fails, do not regenerate a different sequence against stale state. Read the account state again and rebuild the remaining recovery calls.
Use the recovered account
After the final recovery call is confirmed, create a new SDK handle with the complete replacementevm.owners configuration, including its threshold and the same validator module. The old handle still uses the old signers.
Preserve the original account address and deployment metadata in evm.initData using the existing-account setup. Changing owners without attaching the original identity can derive a different account. An address alone is sufficient only when the account is already deployed on every chain you will use; retain the original factory and initialization data for deployment on additional chains.
Recovery changes ownership only on the chain where the calls execute. Verify the owner state on each chain before using the replacement signers there.
EVM Nexus accounts
For Nexus with Ownable V0, pass the same module address used by the account configuration:Solana: install a replacement passkey
Use the recovery key enrolled beforehand withmanageAuthority or all. This is an authority-management procedure, not guardian recovery. Reattach the saved swig with the recovery signer; changing the local owner does not change on-chain roles or derive a replacement wallet.
The example continues your shared authenticated rhinestone instance, saved swig, viem secp256k1 recoverySigner, and newly created viem WebAuthn newPasskey. Keep the recovery key inside its signer. Network availability depends on your environment; solanaDevnet is illustrative.
all grants spending and authority-management power. Choose allButManageAuthority instead only if the replacement should spend without managing keys and you retain a separate authority manager. These permissions are not session budgets or expiry policies.
The role check verifies the requested key and permission, not every aspect of account readiness. Before retrying an uncertain submission, reconcile its intent status through the shared lifecycle. Use the new handle for subsequent signing; the old handle still uses the recovery key.
Installing a replacement does not remove any old role. An authorized manager can use removePasskey or removeEcdsaKey from @rhinestone/sdk/solana in a separate authority transaction to remove a non-root key. The permanent root and the last authority manager cannot be removed. If the lost or compromised passkey was the root, this procedure cannot revoke it; migrate assets to a new wallet when compromise is suspected.