#module #pool #query #message #cosmwasm #osmosis

osmosis-std

包含CosmWasm支持的Osmosis标准库

31个版本 (12个重大更改)

1.19.0 2023年9月25日
0.25.0 2024年5月17日
0.24.0 2024年4月17日
0.22.0 2024年1月15日
0.1.2 2022年7月25日

#2 in #cosmwasm-contracts

Download history 1987/week @ 2024-05-01 2209/week @ 2024-05-08 2625/week @ 2024-05-15 2560/week @ 2024-05-22 3625/week @ 2024-05-29 3409/week @ 2024-06-05 2942/week @ 2024-06-12 3551/week @ 2024-06-19 2915/week @ 2024-06-26 1912/week @ 2024-07-03 2510/week @ 2024-07-10 2744/week @ 2024-07-17 2240/week @ 2024-07-24 2474/week @ 2024-07-31 2261/week @ 2024-08-07 2594/week @ 2024-08-14

每月10,099次下载
用于 62 个crate(23个直接使用)

MIT/Apache

1.5MB
43K SLoC

osmosis-std

osmosis-std on crates.io Docs

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

CosmWasm stargate消息和stargate查询

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

完整的示例合约可以在这里找到。

从CosmWasm合约发布Osmosis的消息

use cosmwasm_std::{CosmosMsg, Response, Env};
use osmosis_std::types::osmosis::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模块

每个模块都有自己的querier,它由protobuf服务定义派生而来,可以在这里找到。

为了避免stargate查询的不确定性,仅对其中一些进行了白名单处理,您可以在这里找到列表这里

use cosmwasm_std::{Deps, Env, StdResult};
use osmosis_std::types::osmosis::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/osmosis-labs/osmosis/blob/f024498f1e8e0d2a1fe259cd9cc4223803fea0cd/proto/osmosis/gamm/v1beta1/query.proto#L82-L84

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

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

因此,osmosis-std为该crate中所有查询响应中使用的所有可能的Any提供了TryFrom trait。

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

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

fn query_pool(
    deps: &Deps,
    pool_id: u64,
) -> StdResult<osmosis_std::types::osmosis::gamm::v1beta1::Pool> {
    let res = GammQuerier::new(&deps.querier).pool(pool_id)?;
    res.pool
        .ok_or_else(|| StdError::not_found("pool"))?
        .try_into() // convert `Any` to `osmosis_std::types::osmosis::gamm::v1beta1::Pool`
        .map_err(|e: DecodeError| StdError::parse_err(
            "osmosis_std::types::osmosis::gamm::v1beta1::Pool",
            e
        ))
}

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

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

enum Pool {
    Balancer(osmosis_std::types::osmosis::gamm::v1beta1::Pool),
    StableSwap(osmosis_std::types::osmosis::gamm::poolmodels::stableswap::v1beta1::Pool),
}

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

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

        Err(StdError::parse_err(
            "Pool",
            "Unmatched pool: must be either `Balancer` or `StableSwap`."
        ))
    }
}

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::not_found("pool"))?
        .try_into() // convert `Any` to `Pool`
}

当将Rust翻译时,特别是与CosmWasm一起,如果我们还想支持json(反)序列化,它可能会变得很复杂。当前的实现可能会从序列化的json中擦除类型url信息。

非CosmWasm客户端

(WIP)

依赖关系

~6–8.5MB
~168K SLoC