15 个版本 (8 个重大更新)

0.10.0 2023年4月4日
0.9.0 2023年3月25日
0.8.0 2023年3月9日
0.3.0 2022年12月16日
0.2.0-rc.12022年11月29日

#21 in #entry-point


7 crate 中使用

GPL-3.0-only

130KB
3K SLoC

BOOT

多环境 CosmWasm 智能合约脚本库。文档可在 boot.abstract.money 查找。

BOOTterra-rust-api 启发,并使用 cosmos-rust 进行 protocol buffer gRPC 通信。

boot-cw-plus 使用 BOOT 为与 cw-plus 合约交互提供标准类型安全的接口。

BOOT 使得快速部署和迭代合约变得更容易。它提供了一系列宏,允许您以更接近 Rust 语法的方式定义合约。这允许您利用 Rust 的类型系统确保您不会向合约发送无效消息。

工作原理

通过使用该端点适当的消息(ExecuteMsgInstantiateMsgQueryMsgMigrateMsg 等)与 CosmWasm 合约的端点进行交互。

为了对合约执行操作,您可以定义一个与合约的接口,将合约的入口点类型传递给 contract

#[contract(InstantiateMsg, ExecuteMsg, QueryMsg, MigrateMsg)]
pub struct MyContract;

该宏为结构体实现了一组特质。这些特质包含可以用来与合约交互的函数,并防止我们在合约上执行错误的消息。

例如,您可以查看 CW20 令牌的实现 这里。

然后,您可以使用此接口与合约交互

...
let cw20_base: Cw20<Chain> = Cw20::new("my_token", chain);
// instantiate a CW20 token instance
let cw20_init_msg = cw20_base::msg::InstantiateMsg {
    decimals: 6,
    name: "Test Token".to_string(),
    initial_balances: vec![Cw20Coin {
        address: sender.to_string(),
        amount: 1000000u128.into(),
    }],
    marketing: None,
    mint: None,
    symbol: "TEST".to_string(),
};
cw20_base.instantiate(&cw20_init_msg, None, None)?;
// query balance
// notice that this query is generated by a macro and not defined in the object itself!
let balance = cw20_base.balance(sender.to_string())?;

您可以在以下链接找到完整的cw20实现:这里。在 cw-multi-test 中如何与合约交互的示例可以在 这里找到,而与真实节点的相同交互可以在 这里找到。

高级功能

BOOT提供了两个额外的宏,可用于提高脚本体验。

ExecuteFns

可以将 ExecuteFns 宏添加到您的合约的 ExecuteMsg 定义中。这将生成一个特质,允许您直接调用消息的变体,而无需自己构建结构。

示例

#[cw_serde]
#[derive(ExecuteFns)]
pub enum ExecuteMsg{
    /// Freeze will make a mutable contract immutable, must be called by an admin
    Freeze {},
    /// UpdateAdmins will change the admin set of the contract, must be called by an existing admin,
    /// and only works if the contract is mutable
    UpdateAdmins { admins: Vec<String> },
    /// the `payable` attribute will add a `coins` argument to the generated function
    #[payable]
    Deposit {}
}

#[contract(Empty,ExecuteMsg,Empty,Empty)]
struct Cw1

impl<Chain: CwEnv> Cw1<Chain> {
    pub fn test_macro(&self) {
        self.freeze().unwrap();
        self.update_admins(vec![]).unwrap(); 
        self.deposit(&[Coin::new(13,"juno")]).unwrap();
    }
}

我们建议将 ExecuteMsgFns 宏放在功能标志后面,以避免默认拉入 boot-core。生成的 derive 会像这样:#[cfg_attr(feature = "boot", derive(boot_core::ExecuteFns))]

对于嵌套执行消息,您可以添加一个 impl_into 属性。这期望消息实现提供类型的 Into 特质。

QueryFns

QueryFns derive 宏与 ExecuteFns 宏的工作方式相同,但它还使用来自 cosmwasm-schema#[returns(QueryResponse)] 属性来生成具有正确响应类型的查询。

贡献

我们非常欢迎您的帮助!请阅读我们的 贡献指南 以开始。

文档

文档使用 mdbook 生成。编辑 docs/src 文件夹中的文件,然后运行

cd docs && mdbook serve --open --port 5000

以查看更改。

参考

轻松享受编写智能合约的乐趣?通过使用 Abstract 轻松构建您的合约。

免责声明

此软件按原样提供,没有任何保证。

依赖关系

~9–28MB
~471K SLoC