Program Delegasi Langganan memungkinkan pengembang untuk mengizinkan pengguna menyetujui transfer token di masa mendatang dari dompet mereka dengan batasan yang jelas. Program ini dirancang untuk pembayaran berulang, langganan, penagihan merchant, dan alur lain di mana pengguna tidak perlu menandatangani setiap transfer secara manual.
Tujuan
Token account Solana dapat menyetujui otoritas lain untuk memindahkan token, tetapi setiap token account hanya dapat memiliki satu otoritas yang disetujui pada satu waktu. Hal ini menyulitkan satu dompet untuk mendukung beberapa pengaturan pengeluaran dengan aman untuk token yang sama, seperti langganan bulanan, tunjangan pengeluaran tetap, dan perjanjian penagihan merchant.
Program ini menyelesaikan masalah tersebut dengan memberikan setiap pasangan
(user, token mint) sebuah Otoritas Langganan yang dikontrol program. Token
account pengguna menyetujui otoritas tersebut satu kali. Program kemudian
memeriksa setiap permintaan transfer terhadap catatan terpisah yang menentukan
siapa yang dapat menarik dana, berapa banyak yang dapat mereka tarik, dan kapan
otorisasi tersebut kedaluwarsa atau direset.
Otoritas Langganan tidak dapat memindahkan dana dengan sendirinya. Transfer hanya berhasil ketika sesuai dengan salah satu otorisasi aktif pengguna.
ID Program
De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44
ID program dideklarasikan dalam program/src/lib.rs. Alur kerja Surfpool lokal
memasang program di alamat kanonik ini.
Model Delegasi
Program ini mendukung tiga model otorisasi:
| Model | Tujuan |
|---|---|
| Delegasi tetap | Izinkan dompet atau layanan lain untuk membelanjakan hingga jumlah total tetap, secara opsional hingga waktu kedaluwarsa. |
| Delegasi berulang | Izinkan dompet atau layanan lain untuk membelanjakan hingga batas yang direset setiap periode, seperti harian, mingguan, atau bulanan. |
| Paket langganan | Izinkan merchant mempublikasikan syarat penagihan yang dapat diterima pengguna, lalu izinkan kolektor yang disetujui untuk menagih pelanggan setiap periode penagihan. |
Token yang Didukung
Mendukung semua mint dari SPL Token maupun Token-2022.
Untuk mint Token-2022 yang dikonfigurasi dengan TransferHook, program
meneruskan akun hook mint (program hook, ExtraAccountMetaList PDA, tambahan)
ke dalam TransferChecked CPI pada setiap transfer yang didelegasikan, sehingga
kebijakan hook diterapkan. SDK akan menyelesaikannya untuk Anda:
- Klien plugin (
transferFixed,transferRecurring,transferSubscription) — ditambahkan secara otomatis. - Membangun secara manual — panggil
resolveTransferHookAccounts, teruskantransferHookAccounts.
Event On-Chain
Program memancarkan event on-chain melalui self-CPI sehingga pengindeks dan aplikasi dapat memantau aktivitas. Semua event terdaftar dalam IDL yang dipublikasikan, sehingga klien yang dihasilkan dapat mendekodenya. Event yang dipancarkan adalah:
FixedTransferEvent,RecurringTransferEvent, danSubscriptionTransferEvent— satu per transfer yang didelegasikan. Masing-masing membawareceiverTokenAccountyang dikreditkan;SubscriptionTransferEventjuga membawapuller.SubscriptionCreatedEvent,SubscriptionCancelledEvent, danSubscriptionResumedEvent— siklus hidup langganan.SubscriptionCreatedEventmembawapayer.PlanUpdatedEvent— dipancarkan ketika sebuah paket diperbarui.
Versioning
Rekaman yang dimiliki program menyertakan kolom versi. Hal ini memberi program jalur untuk memperbarui data akun dari waktu ke waktu tanpa mengganggu pengguna yang sudah ada. Strategi migrasi mendukung:
- Pembaruan in-place secara lazy
- Instruksi migrasi eksplisit
- Fallback revoke dan buat ulang
Kontributor
Proyek ini dikelola oleh para kontributor ke
repositori solana-program/subscriptions.
Status Audit
Program ini telah diaudit oleh Cantina. Status audit, commit baseline, commit
terverifikasi perbaikan, dan delta yang belum diaudit saat ini dilacak di
direktori audits/
repositori.
Aplikasi Demo
Jika Anda ingin mencoba program ini sendiri, Anda dapat melihat contoh aplikasi di sini untuk melihat implementasi end-to-end dari konsep yang dibahas di bagian ini.
Is this page helpful?