ПлатежіПідписки

Огляд

Програма делегування підписок дозволяє розробникам надавати користувачам можливість авторизувати майбутні переказі токенів зі своїх гаманців із чіткими обмеженнями. Вона розроблена для регулярних платежів, підписок, виставлення рахунків продавцями та інших процесів, де користувачу не потрібно підписувати кожен переказ вручну.

Призначення

Облікові записи токенів Solana можуть схвалювати іншого уповноваженого для переміщення токенів, але кожен обліковий запис токена може мати лише одного схваленого уповноваженого одночасно. Це ускладнює безпечну підтримку одним гаманцем кількох угод про витрати для одного й того ж токена, таких як щомісячна підписка, фіксований ліміт витрат і угода про виставлення рахунків продавцем.

Ця програма вирішує це, надаючи кожній парі (user, token mint) керований програмою Уповноважений підписки. Обліковий запис токена користувача схвалює цього уповноваженого один раз. Потім програма перевіряє кожен запитуваний переказ відповідно до окремого запису, який визначає, хто може виводити кошти, скільки може вивести і коли авторизація закінчується або скидається.

Уповноважений підписки не може переміщувати кошти самостійно. Переказ виконується успішно лише тоді, коли він відповідає одній з активних авторизацій користувача.

ID програми

De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44

ID програми оголошено в program/src/lib.rs. Локальні робочі процеси Surfpool встановлюють програму за цією канонічною адресою.

Моделі делегування

Програма підтримує три моделі авторизації:

МодельПризначення
Фіксоване делегуванняДозволити іншому гаманцю або сервісу витрачати до фіксованої загальної суми, за бажанням до закінчення терміну дії.
Періодичне делегуванняДозволити іншому гаманцю або сервісу витрачати до ліміту, який скидається кожен період, наприклад щодня, щотижня або щомісяця.
План підпискиДозволити продавцю опублікувати умови оплати, які користувачі можуть прийняти, а потім дозволити затвердженим збирачам стягувати плату з підписників кожен розрахунковий період.

Підтримувані токени

Підтримує всі монетні двори як SPL Token, так і Token-2022.

Для монетних дворів Token-2022 з налаштованим TransferHook програма передає облікові записи хука монетного двору (програма хука, ExtraAccountMetaList PDA, додаткові) до TransferChecked CPI при кожному делегованому переказі, тому політика хука застосовується примусово. 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?