8 个版本 (4 个重大更改)
0.6.0 | 2022年8月4日 |
---|---|
0.6.0-beta.1 | 2022年5月26日 |
0.5.0 | 2022年4月26日 |
0.4.0 | 2022年3月7日 |
0.2.0 | 2022年1月23日 |
#10 在 #cpi
51KB
1.5K SLoC
zo-abi
abi 是一个仓库,用于通过 Rust 客户端或通过其他 Solana 程序的 CPI 与 01 程序进行接口。
Devnet 令牌水龙头
替换 <WALLET>
、<MINT>
和 <AMOUNT>
curl -XPOST 'https://devnet-faucet.01.xyz?owner=<WALLET>&mint=<MINT>&amount=<AMOUNT>'
SOL 可以直接使用原生 lamports 存入。您可以通过 Solana cli airdrop 或任何 airdrop 水龙头获得 SOL。
使用示例
zo-abi
可以像使用任何其他使用 anchor-lang
构建的工程一样使用。
来自 Solana 程序的 CPI
以下是一个调用 zo
程序并调用 deposit
指令的 CPI 调用示例。更多信息,请参阅官方 anchor CPI 文档。
请注意,与所有 anchor-lang
程序一样,此包的 cpi
功能必须启用。
use anchor_lang::prelude::*;
use zo_abi::{self as zo, program::ZoAbi as Zo};
#[program]
mod my_program {
use super::*;
pub fn do_deposit(ctx: Context<DoDeposit>, amount: u64) -> ProgramResult {
let cpi_program = ctx.accounts.zo_program.to_account_info();
let cpi_accounts = zo::cpi::accounts::Deposit {
authority: ctx.accounts.authority.to_account_info(),
state: ctx.accounts.zo_state.to_account_info(),
state_signer: ctx.accounts.zo_state_signer.to_account_info(),
cache: ctx.accounts.zo_cache.to_account_info(),
margin: ctx.accounts.zo_margin.to_account_info(),
vault: ctx.accounts.zo_vault.to_account_info(),
token_account: ctx.accounts.token_account.to_account_info(),
token_program: ctx.accounts.token_program.to_account_info(),
};
let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts);
zo::cpi::deposit(cpi_ctx, false, amount)?;
Ok(())
}
}
#[derive(Accounts)]
pub struct DoDeposit<'info> {
pub authority: Signer<'info>,
pub zo_state: AccountLoader<'info, zo::State>,
pub zo_state_signer: UncheckedAccount<'info>,
#[account(mut)]
pub zo_cache: AccountLoader<'info, zo::Cache>,
#[account(mut)]
pub zo_margin: AccountLoader<'info, zo::Margin>,
pub zo_vault: UncheckedAccount<'info>,
pub zo_program: Program<'info, Zo>,
pub token_account: UncheckedAccount<'info>,
pub token_program: UncheckedAccount<'info>,
}
客户端
对于更全面的示例,请参阅官方 anchor-client
示例。
use anchor_client::solana_sdk::pubkey::Pubkey;
use anchor_client::solana_sdk::signer::keypair::read_keypair_file;
use anchor_client::{Client, Cluster};
use std::rc::Rc;
use zo_abi as zo;
fn main() {
let payer = read_keypair_file("/path/to/keypair/file").unwrap();
let client = Client::new(Cluster::Devnet, Rc::new(payer));
let program = client.program(zo::ID);
// Loading a program account.
let zo_state: zo::State = program.account(zo::STATE_ID).unwrap();
let zo_cache: zo::Cache = program.account(zo_state.cache).unwrap();
let (zo_state_signer, _) = Pubkey::find_program_address(&[zo::STATE_ID.as_ref()], &zo::ID);
// Calling an instruction.
program
.request()
.args(zo::instruction::Deposit {
repay_only: false,
amount: 1_000_000,
})
.accounts(zo::accounts::Deposit {
authority: program.payer(),
state: zo::STATE_ID,
state_signer: zo_state_signer,
cache: zo_state.cache,
token_program: spl_token::ID,
// ..., etc.
})
.send()
.unwrap();
}
依赖关系
~21–31MB
~529K SLoC