Developers
CosmWasm Connect SDK
Querying Connect prices using CosmWasm and Connect SDK
Building with Connect? Join our Discord!
The Connect SDK provides bindings for the x/oracle
and x/marketmap
modules.
Adding Connect SDK To Your Contract
The version of the Connect SDK for your contract depends on the Connect protocol version of the chain.
Connect Protocol Version | Connect SDK Version |
---|---|
v1.x | v0.1.0 |
v2.x | v0.2.0 |
How to find the Connect Protocol version
The protocol version of Connect can be found on the chain by either:
- Checking the chain’s
go.mod
file. - Checking the required version in the quickstart
Add the following line to the dependencies
section of your Cargo.toml
:
connect-sdk = { git = "https://github.com/skip-mev/connect-sdk", tag = "CONNECT SDK VERSION HERE", package = "connect-sdk" }
Safely Accessing Price Data
The following checks should be made before utilizing a price from Connect in a contract:
- currency-pair exists within the
x/oracle
andx/marketmap
modules. - currency-pair is
enabled
within thex/marketmap
. - price
block_height
is not older than a few blocks. - price nonce is not 0.
Code Example
This code example is for v0.1.0
of the Connect SDK.
contract.rs
use connect_sdk::bindings::query::ConnectQuery;
use connect_sdk::bindings::querier::ConnectQuerier;
use connect_sdk::bindings::marketmap::types::CurrencyPair;
use cosmwasm_std::{Deps, Env, StdResult, Int128, StdError};
fn do_something_with_price(
deps: Deps<ConnectQuery>,
env: Env,
currency_pair: CurrencyPair
) -> StdResult<Int128> {
let connect_querier = ConnectQuerier::new(&deps.querier);
let base = currency_pair.base.to_uppercase();
let quote = currency_pair.quote.to_uppercase();
// Check if the market exists and is enabled
let market = connect_querier.get_marketmap_market(base.clone(), quote.clone())?;
if !market.market.ticker.enabled {
return Err(StdError::generic_err("market is not enabled"));
}
// Check price validity
let price_response = connect_querier.get_oracle_price(base, quote)?;
if price_response.nonce == 0 {
return Err(StdError::generic_err("price has never been updated"));
}
let max_price_age: u64 = 3; // adjust based on appetite for price freshness
let price_age = env.block.height - price_response.price.block_height.unwrap();
if price_age > max_price_age {
return Err(StdError::generic_err("price is too old"));
}
// We can now do something with the price
let valid_price = price_response.price.price;
// Placeholder for actual price processing
Ok(valid_price)
}
Full Example Contract
Example Contract here: example.