3 个稳定版本
4.2.0 | 2024 年 8 月 8 日 |
---|---|
4.1.0 | 2024 年 7 月 31 日 |
4.0.1 | 2024 年 7 月 21 日 |
#1 在 #中子
每月 404 次下载
用于 2 crates
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 中实现多态的一种方式。
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