#模块 #消息 #cosmwasm #查询 #中子 # #包含

margined-neutron-std

包含 CosmWasm 支持的标准库,适用于 Neutron

3 个稳定版本

4.2.0 2024 年 8 月 8 日
4.1.0 2024 年 7 月 31 日
4.0.1 2024 年 7 月 21 日

#1#中子

Download history 144/week @ 2024-07-20 149/week @ 2024-07-27 109/week @ 2024-08-03 73/week @ 2024-08-10 43/week @ 2024-08-17

每月 404 次下载
用于 2 crates

MIT/Apache

500KB
12K SLoC

neutron-std

Neutron 的 proto 生成类型和与 appchain 交互的帮助程序。兼容 CosmWasm 合约。

CosmWasm Stargate 消息和 Stargate 查询

您可以在 neutron_std 中的相应模块中找到从 neutron 的 protobuf 生成的所有类型和查询生成器。要了解每个模块的工作原理,请参阅 neutron 文档

完整的示例合约可以在此处找到。

从 CosmWasm 合约发布 Osmosis 的消息

use cosmwasm_std::{CosmosMsg, Response, Env};
use neutron_std::types::neutron::tokenfactory::v1beta1::MsgCreateDenom;

# type ContractError = cosmwasm_std::StdError;
// ..

pub fn try_create_denom(env: Env, subdenom: String) -> Result<Response, ContractError> {
    let sender = env.contract.address.into();

    // construct message and convert them into cosmos message
    // (notice `CosmosMsg` type and `.into()`)
    let msg_create_denom: CosmosMsg = MsgCreateDenom { sender, subdenom }.into();

    Ok(Response::new()
        .add_message(msg_create_denom)
        .add_attribute("method", "try_create_denom"))
}

查询 Osmosis 的模块

每个模块都有自己的查询器,该查询器是从可以在此处找到的 protobuf 服务定义中派生出来的 此处

为了避免 Stargate 查询的非确定性,只有其中一些被列入白名单,您可以在 此处 找到该列表。

use cosmwasm_std::{Deps, Env, StdResult};
use neutron_std::types::neutron::tokenfactory::v1beta1::{TokenfactoryQuerier, QueryDenomsFromCreatorResponse};

// ..

fn query_creator_denoms(deps: Deps, env: Env) -> StdResult<QueryDenomsFromCreatorResponse> {
    // create `TokenfactoryQuerier`
    let tokenfactory = TokenfactoryQuerier::new(&deps.querier);

    // `TokenfactoryQuerier` has all the fns for querying the module
    let res = tokenfactory.denoms_from_creator(env.contract.address.into())?;

    Ok(QueryDenomsFromCreatorResponse { denoms: res.denoms })
}

查询池

在查询与池相关的值时,例如 Gamm::pool,您可能会发现返回类型包含 Any。这是 cosmos 在 protobuf 中实现多态的一种方式。

https://github.com/neutron-labs/neutron/blob/f024498f1e8e0d2a1fe259cd9cc4223803fea0cd/proto/neutron/gamm/v1beta1/query.proto#L82-L84

message QueryPoolResponse {
  google.protobuf.Any pool = 1 [ (cosmos_proto.accepts_interface) = "PoolI" ];
}

这是由于 neutron 支持多种池类型,这些类型将在未来添加。

因此,neutron-std 为此提供所有可能的 Any 提供了 TryFrom 特性,用于此 crate 中所有查询响应。

这意味着以下代码可以正常工作

use prost::DecodeError;
use cosmwasm_std::{Deps, StdResult, StdError};
use neutron_std::types::neutron::gamm::v1beta1::GammQuerier;

fn query_pool(
    deps: &Deps,
    pool_id: u64,
) -> StdResult<neutron_std::types::neutron::gamm::v1beta1::Pool> {
    let res = GammQuerier::new(&deps.querier).pool(pool_id)?;
    res.pool
        .ok_or_else(|| StdError::NotFound {
            kind: "pool".to_string(),
        })?
        .try_into() // convert `Any` to `neutron_std::types::neutron::gamm::v1beta1::Pool`
        .map_err(|e: DecodeError| StdError::ParseErr {
            target_type: "neutron_std::types::neutron::gamm::v1beta1::Pool".to_string(),
            msg: e.to_string(),
        })
}

或者如果您以后想要支持多种池类型

use prost::{DecodeError, Message};
use cosmwasm_std::{Deps, StdResult, StdError};
use neutron_std::types::neutron::gamm::v1beta1::GammQuerier;

enum Pool {
    Balancer(neutron_std::types::neutron::gamm::v1beta1::Pool),
    StableSwap(neutron_std::types::neutron::gamm::poolmodels::stableswap::v1beta1::Pool),
}

impl TryFrom<neutron_std::shim::Any> for Pool {
    type Error = StdError;

    fn try_from(value: neutron_std::shim::Any) -> Result<Self, Self::Error> {
        if let Ok(pool) = neutron_std::types::neutron::gamm::v1beta1::Pool::decode(value.value.as_slice()) {
            return Ok(Pool::Balancer(pool));
        }
        if let Ok(pool) = neutron_std::types::neutron::gamm::poolmodels::stableswap::v1beta1::Pool::decode(value.value.as_slice()) {
            return Ok(Pool::StableSwap(pool));
        }

        Err(StdError::ParseErr {
            target_type: "Pool".to_string(),
            msg: "Unmatched pool: must be either `Balancer` or `StableSwap`.".to_string(),
        })
    }
}

fn query_pool(
    deps: &Deps,
    pool_id: u64,
) -> StdResult<Pool> {
    let res = GammQuerier::new(&deps.querier).pool(pool_id)?;
    res.pool
        .ok_or_else(|| StdError::NotFound {
            kind: "pool".to_string(),
        })?
        .try_into() // convert `Any` to `Pool`
}

在将 Rust 代码翻译成 Rust,尤其是与 CosmWasm 一起使用时,如果我们也想要支持 JSON (反) 序列化,可能会变得很复杂。 按照当前实现,它可能会从序列化的 JSON 中擦除类型 URL 信息。

非 CosmWasm 客户端

(WIP)

依赖关系

~5.5–9MB
~174K SLoC