25 个版本 (5 个稳定版)
1.4.0 | 2024年5月13日 |
---|---|
1.2.0 | 2024年1月12日 |
1.0.1-beta.4 | 2023年12月29日 |
1.0.1-beta.3 | 2023年10月12日 |
0.3.0 | 2022年10月27日 |
#1 in #cpi
3,658 每月下载量
用于 9 个包 (5 个直接使用)
510KB
12K SLoC
Metaplex Bubblegum SDK
Rust 库,用于与 Metaplex Bublegum 程序交互。
入门
在您的项目文件夹中
cargo add mpl-bubblegum
注意 如果您正在使用先于
solana-program
版本1.16
的版本,请首先将solana-program
依赖项添加到您的项目中,然后添加mpl-bubblegum
。这将确保您只有一个borsh
包的副本。
结构
客户端 SDK 被分为几个模块
accounts
: 表示程序账户的结构体errors
: 表示程序错误的枚举instructions
: 用于创建指令、指令参数和 CPI 指令的结构体types
: 表示程序使用的类型的结构体
指令构建器
客户端 SDK 的主要功能之一是简化指令的创建。自动生成两种“类型”的指令构建器 — 两者都支持通过名称和可选位置传递账户。
客户端 指令构建器
这些旨在供离链客户端代码使用。每个指令都由相应的结构体表示 — 例如,MintV1
pub struct MintV1 {
pub tree_config: solana_program::pubkey::Pubkey,
pub leaf_owner: solana_program::pubkey::Pubkey,
pub leaf_delegate: solana_program::pubkey::Pubkey,
pub merkle_tree: solana_program::pubkey::Pubkey,
pub payer: solana_program::pubkey::Pubkey,
pub tree_creator_or_delegate: solana_program::pubkey::Pubkey,
pub log_wrapper: solana_program::pubkey::Pubkey,
pub compression_program: solana_program::pubkey::Pubkey,
pub system_program: solana_program::pubkey::Pubkey,
}
填写指令账户字段后,您可以使用 instruction(...)
方法生成相应的 solana_program::instruction::Instruction
// instruction args
let metadata = MetadataArgs {
name,
uri,
creators,
...
};
// instruction accounts
let mint_ix = MintV1 {
tree_config,
leaf_owner,
leaf_delegate,
merkle_tree,
payer,
tree_creator_or_delegate,
log_wrapper: spl_noop::ID,
compression_program: spl_account_compression::ID,
system_program: system_program::ID,
};
// creates the instruction
let create_ix = create_ix.instruction(
MintV1InstructionArgs {
metadata,
});
或者,您可以使用 MintV1Builder
创建适当的指令
let mint_ix = MintV1Builder::new()
.tree_config(tree_config)
.leaf_owner(leaf_owner)
.leaf_delegate(leaf_delegate)
.merkle_tree(merkle_tree)
.payer(payer_pubkey)
.tree_creator_or_delegate(tree_creator)
.metadata(metadata)
.instruction();
CPI 指令构建器
这些是供链上代码使用的构建器,将进行 CPI 到 Bubblegum 的操作。类似于“链下”构建器,每个指令都有一个结构来调用 CPI 指令 - 例如,MintV1Cpi
pub struct MintV1Cpi<'a, 'b> {
/// The program to invoke.
pub __program: &'b solana_program::account_info::AccountInfo<'a>,
pub tree_config: &'b solana_program::account_info::AccountInfo<'a>,
pub leaf_owner: &'b solana_program::account_info::AccountInfo<'a>,
pub leaf_delegate: &'b solana_program::account_info::AccountInfo<'a>,
pub merkle_tree: &'b solana_program::account_info::AccountInfo<'a>,
pub payer: &'b solana_program::account_info::AccountInfo<'a>,
pub tree_creator_or_delegate: &'b solana_program::account_info::AccountInfo<'a>,
pub log_wrapper: &'b solana_program::account_info::AccountInfo<'a>,
pub compression_program: &'b solana_program::account_info::AccountInfo<'a>,
pub system_program: &'b solana_program::account_info::AccountInfo<'a>,
/// The arguments for the instruction.
pub __args: MintV1InstructionArgs,
}
填写程序、指令账户和参数字段后,您可以使用 invoke()
或 invoke_signed(...)
方法执行 CPI
// instruction args
let metadata = MetadataArgs {
name,
uri,
creators,
...
};
// instruction accounts
let cpi_mint = MintV1Cpi::new(
bubblegum_info,
MintV1CpiAccounts {
compression_program: spl_account_compression_info,
leaf_delegate: authority_info,
leaf_owner: authority_info,
log_wrapper: spl_noop_info,
merkle_tree: merkle_tree_info,
payer: payer_info,
system_program: system_program_info,
tree_config: tree_config_info,
tree_creator_or_delegate: delegate_info,
},
MintV1InstructionArgs { metadata },
);
// performs the CPI
cpi_mint.invoke_signed(&[&signer_seeds])
您也可以使用 MintV1CpiBuilder
来简化过程
let cpi_mint = MintV1CpiBuilder::new(ctx.accounts.bubblegum)
.compression_program(compression_program_info)
.leaf_delegate(leaf_delegate_info)
.leaf_owner(leaf_owner_info)
.log_wrapper(log_wrapper_info)
.merkle_tree(merkle_tree_info)
.payer(payer_info)
.system_program(system_program_info)
.tree_config(tree_config_info)
.metadata(metadata);
// performs the CPI
cpi_mint.invoke_signed(&[&signer_seeds])
注意 >
*Builder
提供了一种简化创建所需结构的方法,因为它们可以利用在 Kinobi 配置上设置的任何默认值,并且不需要为可选字段设置None
值。
PDA 辅助工具
账户类型(例如,TreeConfig
)具有关联函数来查找 PDA 或创建 PDA TreeConfig
impl TreeConfig {
pub fn create_pda(
merkle_tree: Pubkey,
bump: u8,
) -> Result<solana_program::pubkey::Pubkey, solana_program::pubkey::PubkeyError> {
solana_program::pubkey::Pubkey::create_program_address(
&[merkle_tree.as_ref(), &[bump]],
&crate::MPL_BUBBLEGUM_ID,
)
}
pub fn find_pda(merkle_tree: &Pubkey) -> (solana_program::pubkey::Pubkey, u8) {
solana_program::pubkey::Pubkey::find_program_address(
&[merkle_tree.as_ref()],
&crate::MPL_BUBBLEGUM_ID,
)
}
}
如果已知 bump 种子,则使用
create_pda
函数更便宜(在计算单元方面),特别是对于链上代码。
测试
要从存储库的根目录运行 SDK 测试,请运行以下命令
pnpm install
然后
pnpm clients:rust:test
文档
该模块的文档可以在 此处 找到。
依赖关系
~17–26MB
~448K SLoC