Программа делегирования подписок позволяет разработчикам давать пользователям возможность авторизовать будущие переводы токенов из их кошельков с четкими ограничениями. Она предназначена для регулярных платежей, подписок, выставления счетов торговцами и других сценариев, где пользователь не должен подписывать каждый перевод вручную.
Назначение
Аккаунты токенов Solana могут одобрить другой орган для перемещения токенов, но каждый аккаунт токенов может иметь только один одобренный орган одновременно. Это затрудняет безопасную поддержку одним кошельком нескольких соглашений о расходах для одного и того же токена, таких как ежемесячная подписка, фиксированный лимит расходов и соглашение о выставлении счетов торговцем.
Эта программа решает данную проблему, предоставляя каждой паре
(user, token mint) управляемый программой Орган подписки. Аккаунт токенов
пользователя одобряет этот орган один раз. Затем программа проверяет каждый
запрошенный перевод на соответствие отдельной записи, которая определяет, кто
может списывать средства, сколько он может списать и когда срок действия
авторизации истекает или сбрасывается.
Орган подписки не может перемещать средства самостоятельно. Перевод выполняется успешно только тогда, когда он соответствует одной из активных авторизаций пользователя.
Идентификатор программы
De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44
Идентификатор программы объявлен в program/src/lib.rs. Локальные рабочие
процессы Surfpool устанавливают программу по этому каноническому адресу.
Модели делегирования
Программа поддерживает три модели авторизации:
| Модель | Назначение |
|---|---|
| Фиксированное делегирование | Позволяет другому кошельку или сервису потратить до фиксированной общей суммы, опционально до момента истечения срока действия. |
| Регулярное делегирование | Позволяет другому кошельку или сервису тратить до лимита, который сбрасывается каждый период, например ежедневно, еженедельно или ежемесячно. |
| План подписки | Позволяет торговцу опубликовать условия выставления счетов, которые пользователи могут принять, а затем разрешает утвержденным сборщикам взимать плату с подписчиков каждый расчетный период. |
Поддерживаемые токены
Поддерживает все минты как SPL Token, так и Token-2022.
Для минтов Token-2022 с настроенным TransferHook программа передаёт аккаунты
хука минта (программа хука, PDA ExtraAccountMetaList, дополнительные) в CPI
TransferChecked при каждом делегированном переводе, обеспечивая выполнение
политики хука. SDK разрешает их автоматически:
- Клиент плагина (
transferFixed,transferRecurring,transferSubscription) — добавляется автоматически. - При ручной сборке — вызовите
resolveTransferHookAccounts, передавtransferHookAccounts.
События на блокчейне
Программа генерирует события на блокчейне через self-CPI, чтобы индексаторы и приложения могли отслеживать активность. Все события зарегистрированы в опубликованном IDL, поэтому сгенерированные клиенты могут их декодировать. Генерируемые события:
FixedTransferEvent,RecurringTransferEventиSubscriptionTransferEvent— по одному на каждый делегированный перевод. Каждое содержит начисленныйreceiverTokenAccount;SubscriptionTransferEventтакже содержитpuller.SubscriptionCreatedEvent,SubscriptionCancelledEventиSubscriptionResumedEvent— жизненный цикл подписки.SubscriptionCreatedEventсодержитpayer.PlanUpdatedEvent— генерируется при обновлении плана.
Версионирование
Записи, принадлежащие программе, содержат поле версии. Это позволяет программе обновлять данные аккаунта со временем, не нарушая работу существующих пользователей. Стратегия миграции поддерживает:
- Ленивое обновление на месте
- Явную инструкцию миграции
- Откат с отзывом и повторным созданием
Участники
Проект поддерживается участниками
репозитория solana-program/subscriptions.
Статус аудита
Программа прошла аудит компанией Cantina. Статус аудита, базовый коммит, коммит
с подтверждёнными исправлениями и текущая неаудированная дельта отслеживаются в
директории audits/
репозитория.
Демонстрационное приложение
Если вы хотите самостоятельно ознакомиться с программой, вы можете просмотреть пример приложения здесь, чтобы увидеть сквозную реализацию концепций, рассмотренных в этом разделе.
Is this page helpful?