订阅委托程序使开发者能够让用户授权未来从其钱包进行的代币转账,并设定明确的限制。它专为定期付款、订阅服务、商家账单以及其他用户无需手动签署每笔转账的流程而设计。
目的
Solana 代币账户可以授权另一个权限方转移代币,但每个代币账户一次只能拥有一个已批准的权限方。这使得一个钱包难以安全地支持同一代币的多个支出安排,例如月度订阅、固定支出额度和商家账单协议。
该程序通过为每个 (user, token mint)
配对提供一个由程序控制的订阅权限来解决这个问题。用户的代币账户只需授权该权限一次。然后,程序会根据单独的记录检查每个请求的转账,该记录定义了谁可以提取资金、可以提取多少资金,以及授权何时过期或重置。
订阅权限本身无法转移资金。只有当转账与用户的某个活跃授权匹配时,转账才会成功。
程序 ID
De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44
程序 ID 在 program/src/lib.rs
中声明。本地 Surfpool 工作流会将程序安装在此规范地址。
委托模型
该程序支持三种授权模型:
| 模型 | 用途 |
|---|---|
| 固定委托 | 允许另一个钱包或服务支出最多固定总金额,可选择设置过期时间。 |
| 定期委托 | 允许另一个钱包或服务支出最多一个限额,该限额每个周期(如每日、每周或每月)重置。 |
| 订阅计划 | 允许商家发布用户可接受的账单条款,然后允许已批准的收款方在每个账单周期向订阅者收费。 |
支持的代币
支持来自 SPL Token 和 Token-2022 的所有铸币。
对于配置了 TransferHook
的 Token-2022 铸币,程序会在每次委托转账时将铸币的钩子账户(钩子程序、ExtraAccountMetaList
PDA、附加账户)转发至 TransferChecked
CPI,从而强制执行钩子策略。SDK 会自动为您解析这些账户:
- 插件客户端(
transferFixed、transferRecurring、transferSubscription)——自动附加。 - 手动构建——调用
resolveTransferHookAccounts,传入transferHookAccounts。
链上事件
程序通过自 CPI 方式发出链上事件,供索引器和应用程序追踪活动。所有事件均已注册在已发布的 IDL 中,因此生成的客户端可以对其进行解码。发出的事件包括:
FixedTransferEvent、RecurringTransferEvent和SubscriptionTransferEvent——每次委托转账各触发一次。每个事件携带已记入的receiverTokenAccount;SubscriptionTransferEvent还携带puller。SubscriptionCreatedEvent、SubscriptionCancelledEvent和SubscriptionResumedEvent——订阅生命周期事件。SubscriptionCreatedEvent携带payer。PlanUpdatedEvent——在计划更新时触发。
版本管理
程序拥有的记录包含一个版本字段。这为程序提供了一条随时间升级账户数据的路径,同时不影响现有用户。迁移策略支持:
- 懒惰原地更新
- 显式迁移指令
- 撤销并重建回退
贡献者
本项目由
solana-program/subscriptions 仓库
的贡献者共同维护。
审计状态
本程序已通过 Cantina 的审计。审计状态、基准提交、修复验证提交以及当前未审计的变更增量均在仓库的
audits/ 目录
中进行追踪。
演示应用
如果您希望亲自体验该程序,可以查看此示例应用,了解本节所涵盖概念的端到端实现。
Is this page helpful?