-
Notifications
You must be signed in to change notification settings - Fork 366
docs(subscriptions): document mainnet release changes #1562
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
9af66b5
docs(subscriptions): document mainnet release changes
dev-jodee d4ec95e
docs(subscriptions): tighten prose into leads + bullets
dev-jodee 4bf15e3
docs(subscriptions): generalize supported tokens, drop PYUSD example
dev-jodee 9cc5fa4
docs(subscriptions): drop transfer hook clause from supported tokens …
dev-jodee 08de411
docs(subscriptions): scope hook forwarding to transfer-hook mints
dev-jodee 2140e5d
docs(subscriptions): drop rust field-name aside from startTs note
dev-jodee 1d4d1dc
docs(subscriptions): add revoke-abandoned-subscription, fix update_pl…
dev-jodee ec0573b
docs(subscriptions): pin client install to 0.4.0 for prod release
dev-jodee 3efdcb8
docs(subscriptions): drop comment from update_plan rust example
dev-jodee 6addbe4
docs(subscriptions): document resume, events, update_plan rules, expi…
dev-jodee afcfa86
docs(subscriptions): describe events and update_plan as current state…
dev-jodee e914448
docs(subscriptions): drop update_plan account-list note from plan rules
dev-jodee 28eeb28
docs(subscriptions): fix review findings from code verification
dev-jodee 9fc111a
docs(subscriptions): note token program choice for Token-2022 mints i…
dev-jodee becb1e8
docs(subscriptions): address PR review feedback
dev-jodee File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
120 changes: 120 additions & 0 deletions
120
apps/docs/content/docs/en/payments/subscriptions/revoke-abandoned.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,120 @@ | ||
| --- | ||
| title: Revoke Abandoned Delegations And Subscriptions | ||
| description: | ||
| Guide for reclaiming rent from a delegation or subscription whose Subscription | ||
| Authority is gone. | ||
| --- | ||
|
|
||
| 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](/docs/payments/subscriptions/recurring-delegation#revoke-the-delegation) | Subscription is [cancelled and expired](/docs/payments/subscriptions/subscription-plan#cancel-and-revoke) | | ||
|
|
||
| `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. | ||
|
|
||
| <Tabs items={["TypeScript", "Rust"]}> | ||
| <Tab value="TypeScript"> | ||
| ```ts | ||
| 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, | ||
| }); | ||
| ``` | ||
|
|
||
| </Tab> | ||
|
|
||
| <Tab value="Rust"> | ||
| ```rust | ||
| use solana_address::{address, Address}; | ||
| use subscriptions::generated::instructions::*; | ||
|
|
||
| let payer: Address = address!("PAYER_THAT_FUNDED_RENT_HERE"); | ||
| let delegation_pda: Address = address!("DELEGATION_PDA_ADDRESS_HERE"); | ||
| let subscription_authority: Address = address!("RECORDED_SUBSCRIPTION_AUTHORITY_HERE"); | ||
|
|
||
| let revoke_abandoned_ix = RevokeAbandonedDelegationBuilder::new() | ||
| .payer(payer) | ||
| .delegation_account(delegation_pda) | ||
| .subscription_authority(subscription_authority) | ||
| .instruction(); | ||
| ``` | ||
|
|
||
| </Tab> | ||
| </Tabs> | ||
|
|
||
| ## 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. | ||
|
|
||
| <Tabs items={["TypeScript", "Rust"]}> | ||
| <Tab value="TypeScript"> | ||
| ```ts | ||
| 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, | ||
| }); | ||
| ``` | ||
|
|
||
| </Tab> | ||
|
|
||
| <Tab value="Rust"> | ||
| ```rust | ||
| use solana_address::{address, Address}; | ||
| use subscriptions::generated::instructions::*; | ||
|
|
||
| let payer: Address = address!("PAYER_THAT_FUNDED_RENT_HERE"); | ||
| let subscription_pda: Address = address!("SUBSCRIPTION_PDA_ADDRESS_HERE"); | ||
| let subscription_authority: Address = address!("RECORDED_SUBSCRIPTION_AUTHORITY_HERE"); | ||
| let plan_pda: Address = address!("PLAN_PDA_ADDRESS_HERE"); | ||
|
|
||
| let revoke_abandoned_ix = RevokeAbandonedSubscriptionBuilder::new() | ||
| .payer(payer) | ||
| .subscription_account(subscription_pda) | ||
| .subscription_authority(subscription_authority) | ||
| .plan_pda(plan_pda) | ||
| .instruction(); | ||
| ``` | ||
|
|
||
| </Tab> | ||
| </Tabs> | ||
|
|
||
| ## 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. | ||
| - `RevokeAbandonedDelegation` works for both fixed and recurring delegations. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.