56个版本 (20个破坏性更新)

0.23.0 2024年7月16日
0.21.0 2024年2月20日
0.19.2 2023年10月19日
0.18.0 2023年7月28日
0.2.0-beta.62022年11月25日

1090神奇豆

Download history 446/week @ 2024-04-25 213/week @ 2024-05-02 360/week @ 2024-05-09 288/week @ 2024-05-16 763/week @ 2024-05-23 592/week @ 2024-05-30 219/week @ 2024-06-06 220/week @ 2024-06-13 456/week @ 2024-06-20 169/week @ 2024-06-27 260/week @ 2024-07-04 547/week @ 2024-07-11 285/week @ 2024-07-18 443/week @ 2024-07-25 307/week @ 2024-08-01 310/week @ 2024-08-08

1,515每月下载量
用于26个crate(22个直接使用)

GPL-3.0-or-later

675KB
15K SLoC

Abstract-SDK

此crate为开发人员提供了一组模块化API,用于在他们的CosmWasm智能合约中使用。

入门

要开始使用Abstract SDK,您首先需要了解我们提供的的基本功能以及如何使用这些功能来创建可组合的智能合约API。

功能

Abstract功能是可以在struct上实现的特性。根据使用场景,该struct可以表示智能合约,也可以是一个只实现单个功能的简单struct。每个功能都会在对象上解锁一个函数,允许您检索一些信息。通过组合这些功能,可以编写高级API,这些API会自动在支持其所需功能的对象上实现。

API

Abstract API是只有在合约或功能对象实现了所需的特性/api特性时才能检索到的对象。如果适配器的特性约束得到满足,它将自动在对象上实现,并允许您检索适配器对象。

示例

《Bank》适配器允许开发人员通过其模块对象将资产从账户中转出或转入。我们现在想使用这个适配器创建一个《Splitter》API,该API可以分割一定金额的资金到一组接收者。

use abstract_sdk::{TransferInterface,AbstractSdkResult, Execution, AccountAction};
use abstract_std::objects::AnsAsset;
use cosmwasm_std::{Addr, CosmosMsg, Deps, StdResult, Uint128};

// Trait to retrieve the Splitter object
// Depends on the ability to transfer funds
pub trait SplitterInterface: TransferInterface {
    fn splitter<'a>(&'a self, deps: Deps<'a>) -> Splitter<Self> {
        Splitter { base: self, deps }
    }
}

// Implement for every object that can transfer funds
impl<T> SplitterInterface for T where T: TransferInterface {}

#[derive(Clone)]
pub struct Splitter<'a, T: SplitterInterface> {
    base: &'a T,
    deps: Deps<'a>,
}

impl<'a, T: SplitterInterface> Splitter<'a, T> {
    /// Split an asset to multiple users
    pub fn split(&self, asset: AnsAsset, receivers: &[Addr]) -> AbstractSdkResult<AccountAction> {
        // split the asset between all receivers
        let receives_each = AnsAsset {
            amount: asset
                .amount
                .multiply_ratio(Uint128::one(), Uint128::from(receivers.len() as u128)),
            ..asset
        };

        // Retrieve the bank API
        let bank = self.base.bank(self.deps);
        receivers
            .iter()
            .map(|receiver| {
                // Construct the transfer message
                bank.transfer(vec![&receives_each], receiver)
            })
            .try_fold(AccountAction::new(), |mut acc, v| match v {
                Ok(action) => {
                    acc.merge(action);
                    Ok(acc)
                }
                Err(e) => Err(e),
            })
    }
}

任何实现了其所需特质的合约都可以使用此API,在这种情况下是《TransferInterface》。

  # use abstract_sdk::features::{AccountIdentification, AbstractNameService, ModuleIdentification};
  # use cosmwasm_std::{StdResult, Deps, MessageInfo, CosmosMsg, Addr};
  # use abstract_sdk::feature_objects::AnsHost;
  # use abstract_sdk::{AbstractSdkResult, AccountAction};
  # pub struct MyContract {
  #     
  # }
  # impl AccountIdentification for MyContract {
  #     fn proxy_address(&self, _deps: Deps) -> AbstractSdkResult<Addr> {
  #         Ok(Addr::unchecked("just_an_example"))
  #     }
  # }
  # impl ModuleIdentification for MyContract {
  #     fn module_id(&self) -> &'static str { "my_contract" }
  # }
  # impl AbstractNameService for MyContract {
  #     fn ans_host(&self, _deps: Deps) -> AbstractSdkResult<AnsHost> {
  #         Ok(AnsHost{address: Addr::unchecked("just_an_example")})
  #     }
  # }
  use abstract_sdk::TransferInterface;

  fn forward_deposit(deps: Deps, my_contract: MyContract, message_info: MessageInfo) -> AbstractSdkResult<Vec<CosmosMsg>> {
      let forward_deposit_msg = my_contract.bank(deps).deposit(message_info.funds)?;

      Ok(forward_deposit_msg)
  }

抽象基类

要使用API,可以构造一个《feature object》或者使用抽象基类合约作为应用程序的起点。
可用的基类合约包括

Kind Migratable Installable
App
Adapter

每个基类都支持一组可以接受自定义处理程序的端点。这些处理程序可以通过静态构建器模式添加到基类中。所有可用端点将在此处讨论。

用法

通过运行以下命令将abstract-sdk添加到您的Cargo.toml

cargo add abstract-sdk

依赖项

~5–18MB
~226K SLoC