25 个版本 (5 个稳定版)

1.4.0 2024年5月13日
1.2.0 2024年1月12日
1.0.1-beta.42023年12月29日
1.0.1-beta.32023年10月12日
0.3.0 2022年10月27日

#1 in #cpi

Download history 870/week @ 2024-05-04 1304/week @ 2024-05-11 1239/week @ 2024-05-18 850/week @ 2024-05-25 917/week @ 2024-06-01 1028/week @ 2024-06-08 1090/week @ 2024-06-15 706/week @ 2024-06-22 484/week @ 2024-06-29 704/week @ 2024-07-06 858/week @ 2024-07-13 1021/week @ 2024-07-20 1123/week @ 2024-07-27 904/week @ 2024-08-03 861/week @ 2024-08-10 522/week @ 2024-08-17

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