#payment #transfer #token #account #schedule #recurring #solana

payment-program

在 Solana 上安排一次性及周期性代币转账

8 个版本

0.1.7 2022年1月3日
0.1.6 2022年1月1日
0.1.3 2021年12月31日

#12#recurring

32 每月下载量

ISC 许可证

340KB
4.5K SLoC

TypeScript 3K SLoC // 0.0% comments Rust 1K SLoC // 0.0% comments TSX 43 SLoC // 0.2% comments JavaScript 17 SLoC

支付程序

支付程序在 Solana 上安排一次性及周期性代币转账。它结合了代币账户委托赏金系统,创建了一个无需许可的定时任务队列,能够按每分钟分辨率处理大量“转账任务”。

此协议针对当前的 web3 “支付流”协议提供了两种优化

  1. 资本效率 – 通过使用委托代币转账,发送者不必在收益合同中锁定未来的支付。相反,每隔 X 分钟发送“代币滴”。这在像订阅支付这样的用例中很有用,其中发送者希望“自动批准”每月的账单。

  2. 时间效率 – 对接收者来说,好处是代币直接存入他们的钱包。这些代币可以立即使用,无需“领取”。这对于像工资支付这样的用例很重要,其中接收者希望定期收到他们的收入。

开始使用

# Cargo.toml

[dependencies]
payment-program = { version = "0.1.1", features = ["cpi"] }

代码示例

本节中的代码片段是为需要安排和管理链上支付的分片程序而编写的。这些示例假设程序有一个单例“程序授权账户”,用于代表程序签署指令。

创建支付

此示例指令 create_my_payment 显示了一个创建一次性支付的程序。由于程序使用其授权账户(一个PDA)签署 create_payment 指令,因此授权账户被标记为支付的所有者 – 保证只有程序才能更新它。

// create_my_payment.rs

use {
    crate::state::*,
    anchor_lang::{prelude::*, solana_program::system_program},
    payment_program::{
        cpi::{accounts::CreatePayment, create_payment},
        program::payment_program,
        state::Payment,
    },
};

#[derive(Accounts)]
#[instruction(bump: u8)]
pub struct CreateMyPayment<'info> {
    #[account(mut, seeds = [SEED_AUTHORITY], bump = authority.bump)]
    pub authority: Account<'info, Authority>,

    #[account(mut)]
    pub payment: Account<'info, Payment>,

    #[account(address = payment_program::ID)]
    pub payment_program: Program<'info, PaymentProgram>,

    #[account(mut)]
    pub signer: Signer<'info>,

    #[account(address = system_program::ID)]
    pub system_program: Program<'info, System>,
}

pub fn handler(ctx: Context<CreateMyIndex>, bump: u8) -> ProgramResult {
    // Get accounts.
    let authority = &ctx.accounts.authority;
    let payment = &ctx.accounts.payment;
    let system_program = &ctx.accounts.system_program;

    // TODO Create my payment.
}

依赖项

~24–33MB
~548K SLoC