O Programa de Delegação de Assinaturas permite que desenvolvedores possibilitem que os usuários autorizem transferências futuras de tokens de suas carteiras com limites claros. Ele foi projetado para pagamentos recorrentes, assinaturas, cobrança de comerciantes e outros fluxos onde um usuário não deve ter que assinar cada transferência manualmente.
Finalidade
As contas de token da Solana podem aprovar outra autoridade para movimentar tokens, mas cada conta de token só pode ter uma autoridade aprovada por vez. Isso dificulta que uma carteira suporte com segurança vários arranjos de gastos para o mesmo token, como uma assinatura mensal, um limite de gastos fixo e um acordo de cobrança de comerciante.
Este programa resolve isso ao fornecer a cada par (user, token mint) uma
Autoridade de Assinatura controlada pelo programa. A conta de token do
usuário aprova essa autoridade uma vez. O programa então verifica cada
transferência solicitada contra um registro separado que define quem pode
retirar fundos, quanto pode retirar e quando a autorização expira ou é
redefinida.
A Autoridade de Assinatura não pode movimentar fundos por si só. Uma transferência só é bem-sucedida quando corresponde a uma das autorizações ativas do usuário.
ID do Programa
De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44
O ID do programa é declarado em program/src/lib.rs. Os fluxos de trabalho
locais do Surfpool instalam o programa neste endereço canônico.
Modelos de Delegação
O programa suporta três modelos de autorização:
| Modelo | Finalidade |
|---|---|
| Delegação fixa | Permite que outra carteira ou serviço gaste até um valor total fixo, opcionalmente até um prazo de expiração. |
| Delegação recorrente | Permite que outra carteira ou serviço gaste até um limite que é redefinido a cada período, como diário, semanal ou mensal. |
| Plano de assinatura | Permite que um comerciante publique termos de cobrança que os usuários podem aceitar, e então permite que cobradores aprovados cobrem os assinantes a cada período de cobrança. |
Tokens Suportados
Suporta todos os mints de SPL Token e Token-2022.
Para mints Token-2022 com um TransferHook configurado, o programa encaminha as
contas de hook do mint (programa de hook, PDA ExtraAccountMetaList, extras)
para o CPI TransferChecked em cada transferência delegada, garantindo a
aplicação da política de hook. O SDK resolve-os automaticamente:
- Cliente de plugin (
transferFixed,transferRecurring,transferSubscription) — adicionados automaticamente. - Construção manual — chame
resolveTransferHookAccounts, passetransferHookAccounts.
Eventos On-Chain
O programa emite eventos on-chain via self-CPI para que indexadores e aplicações possam rastrear a atividade. Todos os eventos estão registados no IDL publicado, permitindo que os clientes gerados os decodifiquem. Os eventos emitidos são:
FixedTransferEvent,RecurringTransferEventeSubscriptionTransferEvent— um por transferência delegada. Cada um carrega oreceiverTokenAccountcreditado;SubscriptionTransferEventtambém carrega opuller.SubscriptionCreatedEvent,SubscriptionCancelledEventeSubscriptionResumedEvent— ciclo de vida da subscrição.SubscriptionCreatedEventcarrega opayer.PlanUpdatedEvent— emitido quando um plano é atualizado.
Versionamento
Os registos geridos pelo programa incluem um campo de versão. Isto fornece ao programa um mecanismo para atualizar os dados de conta ao longo do tempo sem quebrar os utilizadores existentes. A estratégia de migração suporta:
- Atualização lazy in-place
- Instrução de migração explícita
- Fallback de revogação e recriação
Contribuidores
O projeto é mantido por contribuidores do
repositório solana-program/subscriptions.
Estado da Auditoria
O programa foi auditado pela Cantina. O estado da auditoria, o commit de base, o
commit de correção verificada e o delta atual não auditado são rastreados no
diretório audits/
do repositório.
Aplicação de Demonstração
Se pretender experimentar o programa por conta própria, pode consultar uma aplicação de exemplo aqui para ver uma implementação completa dos conceitos abordados nesta secção.
Is this page helpful?