Prohibit Nonce Account Self-Withdrawals
- Idea
- Draft
- Review
- Accept
- Implement
- Active
Decision brief
Why this proposal matters
Reject a System Program WithdrawNonceAccount instruction when the nonce account and recipient resolve to the same address. After validating the instruction accounts and nonce state, the System Program returns InvalidArgument when the addresses match. Other nonce withdrawals are unchanged.
Proposal at a glance
What changes
- Validate the instruction account count and sysvars, require a writable source, and decode the nonce state.
- Compare the addresses of the nonce account and recipient.
- If the addresses match, return InvalidArgument.
Stakeholder map
Who is affected
Builders & client teams Medium impact
Because the System Program is a native builtin, validator clients must implement the same feature-gated behavior before activation.
Action may be requiredValidators & operators Medium impact
Because the System Program is a native builtin, validator clients must implement the same feature-gated behavior before activation.
Action may be requiredUsers & stakers Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownGovernance & ecosystem Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownExact source revision
Full proposal document
f1f6c8b05dc2Summary
Reject a System Program WithdrawNonceAccount instruction when the nonce account
and recipient resolve to the same address. After validating the instruction
accounts and nonce state, the System Program returns InvalidArgument when the
addresses match. Other nonce withdrawals are unchanged.
Motivation
Currently, a System Program WithdrawNonceAccount instruction may use the same
account as the nonce account and recipient. Self-withdrawals from uninitialized
nonce accounts and zero or partial self-withdrawals from initialized nonce
accounts that pass existing checks subtract and then restore the requested
lamports, making them no-ops.
A full self-withdrawal from an initialized nonce account that passes the existing checks behaves differently. It deinitializes the nonce account, subtracts its full balance, and restores the lamports to the same account. This leaves a funded, System Program-owned, uninitialized nonce account.
InitializeNonceAccount does not require the nonce account or new authority to
sign. Another party can initialize the account with themselves as the new nonce
authority and control the retained balance. Initiating the self-withdrawal
requires the existing nonce authority, making this an operator footgun.
Self-withdrawals have no known use case. The Stake Program rejects them with
InvalidArgument, and SIMD-0609 proposes the same rule for Vote Program
withdrawals.
New Terminology
N/A
Detailed Design
System Program WithdrawNonceAccount processes an instruction in this order:
- Validate the instruction account count and sysvars, require a writable source, and decode the nonce state.
- Compare the addresses of the nonce account and recipient.
- If the addresses match, return
InvalidArgument. - If the addresses differ, continue existing withdrawal processing.
The new comparison runs before the initialized and uninitialized state branches and their checks for balance, rent, nonce expiration, and required signers. It therefore applies to zero, partial, full-balance, and over-balance withdrawals.
The instruction data and account interface do not change.
Alternatives Considered
- Reject only full self-withdrawals from initialized nonce accounts. This prevents deinitialization but preserves other no-op self-withdrawals.
- Skip deinitialization for full self-withdrawals. This makes them no-ops and leaves a special case that future changes must continue to handle safely.
- Reject self-withdrawals only in the SDK and CLI. Custom transaction builders can bypass client-side checks, so this does not enforce the invariant.
- Keep the existing behavior. This preserves the footgun.
Impact
After activation, nonce account self-withdrawals that reach the address check
fail with InvalidArgument. Non-self withdrawals, instruction encoding, and
account lists are unchanged.
Because the System Program is a native builtin, validator clients must implement the same feature-gated behavior before activation.
Security Considerations
N/A
Evidence graph
Related proposals and rollout
One or more sources are unavailable.
Upstream review record
Upstream discussion & review
GitHub review is editorial context, not evidence of on-chain support, voting, or outcome.
PR #610 · merged SIMD-0610: Prohibit Nonce Account Self-Withdrawals 5 comments and reviews · Sep 15, 2026Hello grod220(https://github.com/grod220)! Welcome to the SIMD process. By opening this PR you are affirming that your SIMD has been thoroughly discussed and vetted in the SIMD discussion section(https://github.com/solana-foundation/solana-improvement-documents/discussions/categories/ideas). The SIMD PR section should only be used to submit a final technical specification for review. If your design / idea still needs discussion, please close this PR and create a new discussion here(https://github.com/solana-foundation/solana-improvement-documents/discussions/categories/ideas). This PR requires the following approvals before it can be merged: - At least one approval from a Anza team member: t
GitHub ↗Thanks, topointon-jump(https://github.com/topointon-jump)! ⚠️ Status: Cannot merge yet - Missing approval from: Anza (t-nelson(https://github.com/t-nelson), steviez(https://github.com/steviez), or bw-solana(https://github.com/bw-solana))
GitHub ↗✅ All approvals received! @grod220, you can now merge this by commenting /merge. ✅ Status: Ready to merge
GitHub ↗/merge
GitHub ↗✅ Merge successful! grod220(https://github.com/grod220)'s PR has been merged.
GitHub ↗Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity. 2
Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity.SIMD
Deployment Status
Feature Gate not yet created
Exact source revision
Sources & integrity
- Proposal document pinned_commit_blob
f1f6c8b05dc205552d3c290a854a438392701107 - simd-document document · stale · Oct 17, 2026
f1f6c8b05dc205552d3c290a854a438392701107
One or more sources are unavailable.
simd.watch community discussion · SIMD-0610
Powered by Giscus · Sign in with GitHub to comment
Community comments load when this section approaches the viewport.