Делегирования и подписки удерживают rent, который при отзыве обычно возвращается
записанному плательщику. Если спонсор пополнил аккаунт, а пользователь
впоследствии закрыл или заменил свой Subscription Authority, аккаунт оказывается
заброшенным, а его rent — заблокированным. RevokeAbandonedDelegation и
RevokeAbandonedSubscription позволяют записанному плательщику вернуть его.
Когда это применяется
Разрешено только в том случае, если Subscription Authority аккаунта явно
недействителен — закрыт или закрыт и пересоздан (так что init_id больше не
совпадает). Активное делегирование или подписка никогда не могут быть закрыты
таким способом.
RevokeAbandonedDelegation | RevokeAbandonedSubscription | |
|---|---|---|
| Закрывает | PDA фиксированного или повторяющегося делегирования | PDA подписки |
| Подписант | Записанный плательщик | Записанный плательщик |
| Аккаунты | Делегирование + записанный authority | Подписка + записанный authority + план |
| Условие применения | Authority закрыт или пересоздан (несовпадение init_id) | То же, для mint плана — mint считывается из привязанного плана, поэтому подставить несвязанный authority для принудительного закрытия невозможно |
| Вместо этого используйте обычный отзыв, если | Делегирование истекло или полностью потрачено | Подписка отменена и истекла |
RevokeAbandonedDelegation — также единственный способ восстановления для
записанного плательщика в случае бессрочного делегирования (expiry_ts == 0),
которое не было полностью потрачено: обычный отзыв для плательщика срабатывает
только по истечении срока или, для фиксированного делегирования, при полном
израсходовании.
Отзыв заброшенного делегирования
Записанный плательщик подписывает транзакцию. Передайте недействительный PDA делегирования и его записанный Subscription Authority (который может быть уже закрыт). Rent возвращается плательщику.
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,});
Отзыв заброшенной подписки
Подписавшийся плательщик подписывает транзакцию. Передайте PDA заброшенной подписки, её зафиксированный Subscription Authority (который к этому моменту может быть уже закрыт), и план, к которому принадлежит подписка. rent возвращается плательщику.
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,});
Примечания
- Транзакцию подписывает зафиксированный плательщик, а не делегатор, делегат или подписчик.
- Оба инструкции завершатся ошибкой, если Subscription Authority всё ещё активен для аккаунта — в таком случае используйте обычный отзыв.
RevokeAbandonedDelegationработает как для фиксированных, так и для периодических делегирований.
Is this page helpful?