Quick-reference recipe card - copy-paste ready.
use anchor_lang :: prelude ::* ;
use anchor_spl :: {
associated_token :: AssociatedToken ,
token :: { self , Mint , Token , TokenAccount , Transfer },
};
#[derive( Accounts )]
pub struct Pay <' info > {
#[account( mut )]
pub payer : Signer <' info >,
#[account( mut )]
pub payer_ata : Account <' info , TokenAccount >,
#[account( mut )]
pub merchant_ata : Account <' info , TokenAccount >,
pub mint : Account <' info , Mint >,
pub token_program : Program <' info , Token >,
pub associated_token_program : Program <' info , AssociatedToken >,
}
pub fn pay (ctx : Context < Pay >, amount : u64 ) -> Result <()> {
require! (amount > 0 , ErrorCode :: InvalidAmount );
token :: transfer (
CpiContext :: new (
ctx . accounts . token_program . to_account_info (),
Transfer {
from : ctx . accounts . payer_ata . to_account_info (),
to : ctx . accounts . merchant_ata . to_account_info (),
authority : ctx . accounts . payer . to_account_info (),
},
),
amount,
) ? ;
Ok (())
}
#[error_code]
pub enum ErrorCode {
#[msg( "amount must be positive" )]
InvalidAmount ,
}
Stack versions: This page was written for Agave 4.1.1 , Solana CLI 3.0.10 , Anchor 0.32.1 , anchor-lang 0.32.1 , Rust 1.91.1 , @solana/kit 7.0.0 , Surfpool 0.12.0 , and LiteSVM 0.6.x . 383k393a3c3q3e393a3o1r3e3k3x383c3e3k1v22223x1v1t1v1z1t20