31个版本 (12个重大更改)
1.19.0 |
|
---|---|
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
每月10,099次下载
用于 62 个crate(23个直接使用)
1.5MB
43K SLoC
osmosis-std
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中实现多态的一种方式。
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