Delegations and subscriptions hold rent that normally returns to their recorded
payer on revoke. If a sponsor funded the account and the user later closes or
replaces their Subscription Authority, the account is stranded and its rent
stuck. RevokeAbandonedDelegation and RevokeAbandonedSubscription let the
recorded payer reclaim it.
When It Applies
Allowed only when the account's Subscription Authority is provably terminal —
closed, or closed and recreated (so init_id no longer matches). A live
delegation or subscription can never be closed this way.
RevokeAbandonedDelegation | RevokeAbandonedSubscription | |
|---|---|---|
| Closes | Fixed or recurring delegation PDA | Subscription PDA |
| Signer | Recorded payer | Recorded payer |
| Accounts | Delegation + recorded authority | Subscription + recorded authority + plan |
| Eligible when | Authority closed, or recreated (init_id mismatch) | Same, for the plan's mint — the mint is read from the bound plan, so an unrelated authority cannot be substituted to force a close |
| Use ordinary revoke instead when | Delegation is expired or fully spent | Subscription is cancelled and expired |
RevokeAbandonedDelegation is also the recorded payer's only recovery path for
a never-expiring delegation (expiry_ts == 0) that isn't fully spent: ordinary
revoke fires for the payer only on expiry or, for a fixed delegation, full
spend.
Revoke An Abandoned Delegation
The recorded payer signs. Pass the dead delegation PDA and its recorded Subscription Authority (which may already be closed). Rent returns to the payer.
import { getRevokeAbandonedDelegationInstruction } from '@solana/subscriptions';// Build the instruction and send it in a transaction like any other.const revokeAbandonedIx = getRevokeAbandonedDelegationInstruction({payer: payerSigner,delegationAccount: delegationPda,subscriptionAuthority: subscriptionAuthorityPda,});
Revoke An Abandoned Subscription
The recorded payer signs. Pass the abandoned subscription PDA, its recorded Subscription Authority (which may already be closed), and the plan the subscription belongs to. Rent returns to the payer.
import { getRevokeAbandonedSubscriptionInstruction } from '@solana/subscriptions';// Build the instruction and send it in a transaction like any other.const revokeAbandonedIx = getRevokeAbandonedSubscriptionInstruction({payer: payerSigner,subscriptionAccount: subscriptionPda,subscriptionAuthority: subscriptionAuthorityPda,planPda,});
Notes
- The recorded payer signs, not the delegator, delegatee, or subscriber.
- Both instructions fail if the Subscription Authority is still live for the account — use ordinary revoke instead.
RevokeAbandonedDelegationworks for both fixed and recurring delegations.
Is this page helpful?