From dcdcf174fb3f60d40c1b095d1cde05ff51567656 Mon Sep 17 00:00:00 2001 From: DrPresident Date: Thu, 23 Jan 2025 14:35:05 -0600 Subject: [PATCH 1/5] generalized dshd oracle to any derivative --- Cargo.lock | 26 ++-- Cargo.toml | 4 +- add_derivative.json | 11 ++ .../Cargo.toml | 2 +- .../src/contract.rs | 112 +++++++++--------- .../src/derivative.rs} | 0 .../src/lib.rs | 2 +- .../src/msg.rs | 15 ++- .../Cargo.toml | 2 +- .../src/contract.rs | 0 .../{mock_dshd => mock_derivative}/src/lib.rs | 0 .../{mock_dshd => mock_derivative}/src/msg.rs | 0 packages/multi_test/Cargo.toml | 4 +- packages/multi_test/src/harness.rs | 4 +- .../src/helpers/{dshd.rs => derivative.rs} | 14 +-- .../{dshd_oracle.rs => derivative_oracle.rs} | 32 +++-- packages/multi_test/src/helpers/mod.rs | 4 +- 17 files changed, 133 insertions(+), 99 deletions(-) create mode 100644 add_derivative.json rename contracts/{mock_dshd => derivative_oracle}/Cargo.toml (96%) rename contracts/{dshd_oracle => derivative_oracle}/src/contract.rs (64%) rename contracts/{dshd_oracle/src/dshd.rs => derivative_oracle/src/derivative.rs} (100%) rename contracts/{dshd_oracle => derivative_oracle}/src/lib.rs (60%) rename contracts/{dshd_oracle => derivative_oracle}/src/msg.rs (62%) rename contracts/{dshd_oracle => mock_derivative}/Cargo.toml (96%) rename contracts/{mock_dshd => mock_derivative}/src/contract.rs (100%) rename contracts/{mock_dshd => mock_derivative}/src/lib.rs (100%) rename contracts/{mock_dshd => mock_derivative}/src/msg.rs (100%) rename packages/multi_test/src/helpers/{dshd.rs => derivative.rs} (96%) rename packages/multi_test/src/helpers/{dshd_oracle.rs => derivative_oracle.rs} (68%) diff --git a/Cargo.lock b/Cargo.lock index f3c01a7..b0b30df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -349,6 +349,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derivative_oracle" +version = "0.2.0" +dependencies = [ + "cosmwasm-schema", + "secret-cosmwasm-std", + "shade-oracles", + "shade-toolkit", +] + [[package]] name = "derive-from-ext" version = "0.2.0" @@ -389,16 +399,6 @@ dependencies = [ "shade-oracles", ] -[[package]] -name = "dshd_oracle" -version = "0.2.0" -dependencies = [ - "cosmwasm-schema", - "secret-cosmwasm-std", - "shade-oracles", - "shade-toolkit", -] - [[package]] name = "dyn-clone" version = "1.0.17" @@ -760,7 +760,7 @@ dependencies = [ ] [[package]] -name = "mock_dshd" +name = "mock_derivative" version = "0.2.0" dependencies = [ "cosmwasm-schema", @@ -1573,10 +1573,10 @@ dependencies = [ name = "shade-oracles-multi-test" version = "0.1.0" dependencies = [ - "dshd_oracle", + "derivative_oracle", "index_oracle", "mock_band", - "mock_dshd", + "mock_derivative", "mock_ojo", "multi-test-helpers", "oracle_mocks", diff --git a/Cargo.toml b/Cargo.toml index 8d56249..687cf89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,8 @@ members = [ "contracts/mock_band", "contracts/mock_ojo", "contracts/oracle_router", - "contracts/dshd_oracle", - "contracts/mock_dshd", + "contracts/derivative_oracle", + "contracts/mock_derivative", "contracts/shade_staking_derivatives_oracle", "contracts/shadeswap_market_oracle", "contracts/shadeswap_spot_oracle", diff --git a/add_derivative.json b/add_derivative.json new file mode 100644 index 0000000..6d2d0f6 --- /dev/null +++ b/add_derivative.json @@ -0,0 +1,11 @@ +{ + "set_derivatives": [ + { + "key": "Drop Protocol ATOM", + "underlying_key": "ATOM", + "initial_rate": "1.012625597295035186", + "rate_timeout": 97200, + "rate_max_change": "0.1" + } + ] +} diff --git a/contracts/mock_dshd/Cargo.toml b/contracts/derivative_oracle/Cargo.toml similarity index 96% rename from contracts/mock_dshd/Cargo.toml rename to contracts/derivative_oracle/Cargo.toml index 268b22a..33907cf 100644 --- a/contracts/mock_dshd/Cargo.toml +++ b/contracts/derivative_oracle/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "mock_dshd" +name = "derivative_oracle" version = "0.2.0" authors = ["Jackson Swenson "] edition = "2021" diff --git a/contracts/dshd_oracle/src/contract.rs b/contracts/derivative_oracle/src/contract.rs similarity index 64% rename from contracts/dshd_oracle/src/contract.rs rename to contracts/derivative_oracle/src/contract.rs index 724cc14..4248b15 100644 --- a/contracts/dshd_oracle/src/contract.rs +++ b/contracts/derivative_oracle/src/contract.rs @@ -8,14 +8,16 @@ use shade_oracles::interfaces::providers::ReferenceData; use shade_oracles::ssp::Item; use shade_toolkit::{Contract, Query, BLOCK_SIZE}; -use crate::{dshd, msg::*}; +use crate::{derivative, msg::*}; +/* // Key used to query router pub const UNDERLYING_KEY: &str = "SHD"; // Key for the "price" (underlying * redemption_rate) pub const PRICE_KEY: &str = "Shade Derivative"; // Key for the redemption rate pub const RATE_KEY: &str = "Shade Derivative Rate"; +*/ // Storage const CONFIG: Item = Item::new("config"); @@ -27,18 +29,18 @@ pub fn instantiate( _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { - let admin_auth = msg.admin_auth.validate(deps.api)?; - let router = msg.router.validate(deps.api)?; - let dshd = msg.dshd.validate(deps.api)?; - - let config = Config { - admin_auth, - router, - dshd, - enabled: true, - }; - - CONFIG.save(deps.storage, &config)?; + CONFIG.save( + deps.storage, + &Config { + admin_auth: msg.admin_auth.validate(deps.api)?, + router: msg.router.validate(deps.api)?, + derivative: msg.derivative.validate(deps.api)?, + underlying_key: msg.underlying_key, + price_key: msg.price_key, + rate_key: msg.rate_key, + enabled: true, + }, + )?; Ok(Response::default()) } @@ -61,8 +63,11 @@ pub fn execute( match msg { ExecuteMsg::UpdateConfig { router, - dshd, + derivative, admin_auth, + underlying_key, + price_key, + rate_key, enabled, } => { validate_admin( @@ -80,9 +85,21 @@ pub fn execute( config.admin_auth = admin_auth.validate(deps.api)?; resp = resp.add_attribute("admin_auth", config.admin_auth.address.clone()); } - if let Some(dshd) = dshd { - config.dshd = dshd.validate(deps.api)?; - resp = resp.add_attribute("dshd", config.dshd.address.clone()); + if let Some(derivative) = derivative { + config.derivative = derivative.validate(deps.api)?; + resp = resp.add_attribute("derivative", config.derivative.address.clone()); + } + if let Some(underlying_key) = underlying_key { + config.underlying_key = underlying_key; + resp = resp.add_attribute("underlying_key", config.underlying_key.clone()); + } + if let Some(price_key) = price_key { + config.price_key = price_key; + resp = resp.add_attribute("price_key", config.price_key.clone()); + } + if let Some(rate_key) = rate_key { + config.rate_key = rate_key; + resp = resp.add_attribute("rate_key", config.rate_key.clone()); } if let Some(enabled) = enabled { config.enabled = enabled; @@ -100,23 +117,13 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { require_enabled(&config)?; pad_query_result( match msg { - QueryMsg::GetPrice { key } => to_binary(&query_oracle_price_by_key( - &deps, - &env, - key, - &config.router, - &config.dshd, - )?), + QueryMsg::GetPrice { key } => { + to_binary(&query_oracle_price_by_key(&deps, &env, key, &config)?) + } QueryMsg::GetPrices { keys } => { let mut results = vec![]; for key in keys { - results.push(query_oracle_price_by_key( - &deps, - &env, - key, - &config.router, - &config.dshd, - )?); + results.push(query_oracle_price_by_key(&deps, &env, key, &config)?); } to_binary(&results) } @@ -130,31 +137,26 @@ fn query_oracle_price_by_key( deps: &Deps, env: &Env, key: String, - router: &Contract, - dshd: &Contract, + config: &Config, ) -> StdResult { - if key == PRICE_KEY.to_string() { - query_price(deps, env, router, dshd) - } else if key == RATE_KEY.to_string() { - query_rate(deps, env, dshd) + if key == config.price_key.to_string() { + query_price(deps, env, config) + } else if key == config.rate_key.to_string() { + query_rate(deps, env, config) } else { Err(StdError::generic_err(format!( "Invalid Key, expected one of {}, {}", - PRICE_KEY, RATE_KEY + config.price_key, config.rate_key ))) } } -fn query_price( - deps: &Deps, - env: &Env, - router: &Contract, - dshd: &Contract, -) -> StdResult { - let underlying_price = query_router_price(&router, &deps.querier, UNDERLYING_KEY.to_string())?; - let rate = query_rate(deps, env, dshd)?; +fn query_price(deps: &Deps, env: &Env, config: &Config) -> StdResult { + let underlying_price = + query_router_price(&config.router, &deps.querier, config.underlying_key.clone())?; + let rate = query_rate(deps, env, config)?; Ok(OraclePrice { - key: PRICE_KEY.to_string(), + key: config.price_key.to_string(), data: ReferenceData { rate: (underlying_price.data.rate * rate.data.rate) / Uint256::from(exp10(18).as_u128()), @@ -164,12 +166,12 @@ fn query_price( }) } -fn query_rate(deps: &Deps, env: &Env, dshd: &Contract) -> StdResult { - let staking_info = query_staking_info(&dshd, &deps.querier)?; +fn query_rate(deps: &Deps, env: &Env, config: &Config) -> StdResult { + let staking_info = query_staking_info(&config.derivative, &deps.querier)?; let now = env.block.time.seconds(); // normalize from 10^6 to 10^18 Ok(OraclePrice { - key: RATE_KEY.to_string(), + key: config.rate_key.to_string(), data: ReferenceData { // price is in utkn (8 decimal SHD), upscaling by 10^10 to get 10^18 rate: Uint256::from(staking_info.price * Uint128::new(exp10(10).as_u128())), @@ -188,11 +190,11 @@ pub fn query_router_price( } pub fn query_staking_info( - dshd: &Contract, + derivative: &Contract, querier: &QuerierWrapper, -) -> StdResult { - match (dshd::QueryMsg::StakingInfo {}.query(querier, dshd)?) { - dshd::QueryResponse::StakingInfo { +) -> StdResult { + match (derivative::QueryMsg::StakingInfo {}.query(querier, derivative)?) { + derivative::QueryResponse::StakingInfo { unbonding_time, bonded_shd, rewards, @@ -200,7 +202,7 @@ pub fn query_staking_info( price, fee_info, status, - } => Ok(dshd::StakingInfoResponse { + } => Ok(derivative::StakingInfoResponse { unbonding_time, bonded_shd, rewards, diff --git a/contracts/dshd_oracle/src/dshd.rs b/contracts/derivative_oracle/src/derivative.rs similarity index 100% rename from contracts/dshd_oracle/src/dshd.rs rename to contracts/derivative_oracle/src/derivative.rs diff --git a/contracts/dshd_oracle/src/lib.rs b/contracts/derivative_oracle/src/lib.rs similarity index 60% rename from contracts/dshd_oracle/src/lib.rs rename to contracts/derivative_oracle/src/lib.rs index e6db38a..1b57ba3 100644 --- a/contracts/dshd_oracle/src/lib.rs +++ b/contracts/derivative_oracle/src/lib.rs @@ -1,3 +1,3 @@ pub mod contract; -pub mod dshd; +pub mod derivative; pub mod msg; diff --git a/contracts/dshd_oracle/src/msg.rs b/contracts/derivative_oracle/src/msg.rs similarity index 62% rename from contracts/dshd_oracle/src/msg.rs rename to contracts/derivative_oracle/src/msg.rs index 1501060..10f9e20 100644 --- a/contracts/dshd_oracle/src/msg.rs +++ b/contracts/derivative_oracle/src/msg.rs @@ -8,24 +8,33 @@ impl_msg_callbacks!(); #[cw_serde] pub struct Config { pub router: Contract, - pub dshd: Contract, + pub derivative: Contract, pub admin_auth: Contract, + pub underlying_key: String, + pub price_key: String, + pub rate_key: String, pub enabled: bool, } #[cw_serde] pub struct InstantiateMsg { pub router: RawContract, - pub dshd: RawContract, + pub derivative: RawContract, pub admin_auth: RawContract, + pub underlying_key: String, + pub price_key: String, + pub rate_key: String, } #[cw_serde] pub enum ExecuteMsg { UpdateConfig { router: Option, - dshd: Option, + derivative: Option, admin_auth: Option, + underlying_key: Option, + price_key: Option, + rate_key: Option, enabled: Option, }, } diff --git a/contracts/dshd_oracle/Cargo.toml b/contracts/mock_derivative/Cargo.toml similarity index 96% rename from contracts/dshd_oracle/Cargo.toml rename to contracts/mock_derivative/Cargo.toml index 0714f6e..0f5393d 100644 --- a/contracts/dshd_oracle/Cargo.toml +++ b/contracts/mock_derivative/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "dshd_oracle" +name = "mock_derivative" version = "0.2.0" authors = ["Jackson Swenson "] edition = "2021" diff --git a/contracts/mock_dshd/src/contract.rs b/contracts/mock_derivative/src/contract.rs similarity index 100% rename from contracts/mock_dshd/src/contract.rs rename to contracts/mock_derivative/src/contract.rs diff --git a/contracts/mock_dshd/src/lib.rs b/contracts/mock_derivative/src/lib.rs similarity index 100% rename from contracts/mock_dshd/src/lib.rs rename to contracts/mock_derivative/src/lib.rs diff --git a/contracts/mock_dshd/src/msg.rs b/contracts/mock_derivative/src/msg.rs similarity index 100% rename from contracts/mock_dshd/src/msg.rs rename to contracts/mock_derivative/src/msg.rs diff --git a/packages/multi_test/Cargo.toml b/packages/multi_test/Cargo.toml index f74e3cf..516ef99 100644 --- a/packages/multi_test/Cargo.toml +++ b/packages/multi_test/Cargo.toml @@ -23,8 +23,8 @@ mock_band = { path = "../../contracts/mock_band" } mock_ojo = { path = "../../contracts/mock_ojo" } index_oracle = { path = "../../contracts/index_oracle" } -mock_dshd = { path = "../../contracts/mock_dshd" } -dshd_oracle = { path = "../../contracts/dshd_oracle" } +mock_derivative = { path = "../../contracts/mock_derivative" } +derivative_oracle = { path = "../../contracts/derivative_oracle" } shade_staking_derivatives_oracle = { path = "../../contracts/shade_staking_derivatives_oracle" } stride_staking_derivatives_oracle = { path = "../../contracts/staking_derivatives/stride" } diff --git a/packages/multi_test/src/harness.rs b/packages/multi_test/src/harness.rs index 22c142d..40c748f 100644 --- a/packages/multi_test/src/harness.rs +++ b/packages/multi_test/src/harness.rs @@ -11,8 +11,8 @@ create_harness!(band, MockBand, mock_band); create_harness!(ojo, MockOjo, mock_ojo); create_harness!(router, OracleRouter, oracle_router); create_harness!(index, IndexOracle, index_oracle); -create_harness!(dshd, MockDShd, mock_dshd); -create_harness!(dshd_oracle, DShdOracle, dshd_oracle); +create_harness!(derivative, MockDerivative, mock_derivative); +create_harness!(derivative_oracle, DerivativeOracle, derivative_oracle); pub mod dex { pub mod siennaswap { diff --git a/packages/multi_test/src/helpers/dshd.rs b/packages/multi_test/src/helpers/derivative.rs similarity index 96% rename from packages/multi_test/src/helpers/dshd.rs rename to packages/multi_test/src/helpers/derivative.rs index adbd56b..2b28f7e 100644 --- a/packages/multi_test/src/helpers/dshd.rs +++ b/packages/multi_test/src/helpers/derivative.rs @@ -1,10 +1,10 @@ use super::*; -use mock_dshd::msg::*; +use mock_derivative::msg::*; use shade_oracles::{interfaces::providers::RawProvider, status::ContractStatus}; -create_test_helper!(DShdHelper); +create_test_helper!(DerivativeHelper); -impl DShdHelper { +impl DerivativeHelper { pub fn init(user: &User, app: &mut App, price: &Uint128) -> Self { let contract = user .init( @@ -12,8 +12,8 @@ impl DShdHelper { &InstantiateMsg { price: price.clone(), }, - MockDShd::default(), - "dshd", + MockDerivative::default(), + "derivative", ) .unwrap(); Self(contract) @@ -52,8 +52,8 @@ mod test { let user = admin; let app = &mut app; - let dshd = DShdHelper::init(user); - let dshd_oracle = DShdOracleHelper::init(user, app, router, dshd, admin_auth); + let derivative = DerivativeHelper::init(user); + let derivative_oracle = DerivativeOracleHelper::init(user, app, router, derivative, admin_auth); /* let usd_protection = ProtectedKeyInfo::new( diff --git a/packages/multi_test/src/helpers/dshd_oracle.rs b/packages/multi_test/src/helpers/derivative_oracle.rs similarity index 68% rename from packages/multi_test/src/helpers/dshd_oracle.rs rename to packages/multi_test/src/helpers/derivative_oracle.rs index 8be207d..a3f0ab0 100644 --- a/packages/multi_test/src/helpers/dshd_oracle.rs +++ b/packages/multi_test/src/helpers/derivative_oracle.rs @@ -2,9 +2,9 @@ use super::{ AnyResult, App, AppResponse, Contract, OracleRouter, PriceResponse, PricesResponse, RawContract, StdResult, User, }; -use crate::harness::dshd_oracle::DShdOracle; +use crate::harness::derivative_oracle::DerivativeOracle; use crate::helpers::TestScenario; -use dshd_oracle::msg::*; +use derivative_oracle::msg::*; use shade_oracles::interfaces::router; use shade_oracles::{core::Query, interfaces::providers::RawProvider, status::ContractStatus}; use shade_toolkit::{ @@ -12,26 +12,32 @@ use shade_toolkit::{ ExecuteCallback, InstantiateCallback, }; -create_test_helper!(DShdOracleHelper); +create_test_helper!(DerivativeOracleHelper); -impl DShdOracleHelper { +impl DerivativeOracleHelper { pub fn init( user: &User, app: &mut App, router: &Contract, - dshd: &Contract, + derivative: &Contract, admin_auth: &Contract, + underlying_key: String, + price_key: String, + rate_key: String, ) -> Self { let contract = user .init( app, &InstantiateMsg { router: router.clone().into(), - dshd: dshd.clone().into(), + derivative: derivative.clone().into(), admin_auth: admin_auth.clone().into(), + underlying_key, + price_key, + rate_key, }, - DShdOracle::default(), - "dshd_oracle", + DerivativeOracle::default(), + "derivative_oracle", ) .unwrap(); Self(contract) @@ -42,16 +48,22 @@ impl DShdOracleHelper { sender: &User, app: &mut App, router: Option, - dshd: Option, + derivative: Option, admin_auth: Option, + underlying_key: Option, + price_key: Option, + rate_key: Option, enabled: Option, ) -> AnyResult { sender.exec( app, &ExecuteMsg::UpdateConfig { router, - dshd, + derivative, admin_auth, + underlying_key, + price_key, + rate_key, enabled, }, &self.0, diff --git a/packages/multi_test/src/helpers/mod.rs b/packages/multi_test/src/helpers/mod.rs index 2c88b3a..dfc2347 100644 --- a/packages/multi_test/src/helpers/mod.rs +++ b/packages/multi_test/src/helpers/mod.rs @@ -6,10 +6,10 @@ use super::*; pub(crate) use rstest::*; pub mod common; +pub mod derivative; +pub mod derivative_oracle; pub mod derivatives; pub mod dex; -pub mod dshd; -pub mod dshd_oracle; pub mod index; pub mod router; pub use common::*; From b1d83d10672b7ec106358b17c27ab97231f5e400 Mon Sep 17 00:00:00 2001 From: DrPresident Date: Tue, 4 Feb 2025 11:24:23 -0600 Subject: [PATCH 2/5] added decimals to config --- contracts/derivative_oracle/src/contract.rs | 13 ++++++++++++- contracts/derivative_oracle/src/msg.rs | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/contracts/derivative_oracle/src/contract.rs b/contracts/derivative_oracle/src/contract.rs index 4248b15..34f990a 100644 --- a/contracts/derivative_oracle/src/contract.rs +++ b/contracts/derivative_oracle/src/contract.rs @@ -36,6 +36,7 @@ pub fn instantiate( router: msg.router.validate(deps.api)?, derivative: msg.derivative.validate(deps.api)?, underlying_key: msg.underlying_key, + underlying_decimals: msg.underlying_decimals, price_key: msg.price_key, rate_key: msg.rate_key, enabled: true, @@ -66,6 +67,7 @@ pub fn execute( derivative, admin_auth, underlying_key, + underlying_decimals, price_key, rate_key, enabled, @@ -93,6 +95,13 @@ pub fn execute( config.underlying_key = underlying_key; resp = resp.add_attribute("underlying_key", config.underlying_key.clone()); } + if let Some(underlying_decimals) = underlying_decimals { + config.underlying_decimals = underlying_decimals; + resp = resp.add_attribute( + "underlying_decimals", + config.underlying_decimals.to_string(), + ); + } if let Some(price_key) = price_key { config.price_key = price_key; resp = resp.add_attribute("price_key", config.price_key.clone()); @@ -174,7 +183,9 @@ fn query_rate(deps: &Deps, env: &Env, config: &Config) -> StdResult key: config.rate_key.to_string(), data: ReferenceData { // price is in utkn (8 decimal SHD), upscaling by 10^10 to get 10^18 - rate: Uint256::from(staking_info.price * Uint128::new(exp10(10).as_u128())), + rate: Uint256::from( + staking_info.price * Uint128::new(exp10(18 - config.underlying_decimals).as_u128()), + ), last_updated_base: now, last_updated_quote: now, }, diff --git a/contracts/derivative_oracle/src/msg.rs b/contracts/derivative_oracle/src/msg.rs index 10f9e20..9cdbc4f 100644 --- a/contracts/derivative_oracle/src/msg.rs +++ b/contracts/derivative_oracle/src/msg.rs @@ -11,6 +11,7 @@ pub struct Config { pub derivative: Contract, pub admin_auth: Contract, pub underlying_key: String, + pub underlying_decimals: u8, pub price_key: String, pub rate_key: String, pub enabled: bool, @@ -22,6 +23,7 @@ pub struct InstantiateMsg { pub derivative: RawContract, pub admin_auth: RawContract, pub underlying_key: String, + pub underlying_decimals: u8, pub price_key: String, pub rate_key: String, } @@ -33,6 +35,7 @@ pub enum ExecuteMsg { derivative: Option, admin_auth: Option, underlying_key: Option, + underlying_decimals: Option, price_key: Option, rate_key: Option, enabled: Option, From 8c38702aeccc75aee3df14dfced5b97fbbb7f0c6 Mon Sep 17 00:00:00 2001 From: DrPresident Date: Tue, 18 Feb 2025 12:10:10 -0600 Subject: [PATCH 3/5] updated comment --- contracts/derivative_oracle/src/contract.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/derivative_oracle/src/contract.rs b/contracts/derivative_oracle/src/contract.rs index 34f990a..c57ff2a 100644 --- a/contracts/derivative_oracle/src/contract.rs +++ b/contracts/derivative_oracle/src/contract.rs @@ -182,7 +182,7 @@ fn query_rate(deps: &Deps, env: &Env, config: &Config) -> StdResult Ok(OraclePrice { key: config.rate_key.to_string(), data: ReferenceData { - // price is in utkn (8 decimal SHD), upscaling by 10^10 to get 10^18 + // price is in utkn, upscaling by 10^(18-decimals) to get 10^18 rate: Uint256::from( staking_info.price * Uint128::new(exp10(18 - config.underlying_decimals).as_u128()), ), From 8338be2b5db4f12cfbbb2c86f54d952648875a38 Mon Sep 17 00:00:00 2001 From: DrPresident Date: Tue, 18 Feb 2025 15:37:42 -0600 Subject: [PATCH 4/5] x token oracle working --- Cargo.lock | 344 +++++++++++-------- Cargo.toml | 1 + contracts/x_token_oracle/Cargo.toml | 27 ++ contracts/x_token_oracle/src/contract.rs | 222 ++++++++++++ contracts/x_token_oracle/src/lib.rs | 3 + contracts/x_token_oracle/src/money_market.rs | 62 ++++ contracts/x_token_oracle/src/msg.rs | 47 +++ 7 files changed, 555 insertions(+), 151 deletions(-) create mode 100644 contracts/x_token_oracle/Cargo.toml create mode 100644 contracts/x_token_oracle/src/contract.rs create mode 100644 contracts/x_token_oracle/src/lib.rs create mode 100644 contracts/x_token_oracle/src/money_market.rs create mode 100644 contracts/x_token_oracle/src/msg.rs diff --git a/Cargo.lock b/Cargo.lock index b0b30df..f7192cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,7 @@ version = 3 [[package]] name = "admin" version = "0.2.0" -source = "git+https://github.com/securesecrets/shade#ae81bce8e1cb42df40b28aa811e9f701a4d78738" +source = "git+https://github.com/securesecrets/shade#93ec008bc7184af9c31fdb26d9242dce64702952" dependencies = [ "secret-cosmwasm-std", "shade-protocol", @@ -24,15 +24,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "base16ct" @@ -125,25 +125,24 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" dependencies = [ "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.77", - "syn_derive", + "syn 2.0.98", ] [[package]] @@ -173,15 +172,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.1.15" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ "shlex", ] @@ -219,18 +218,18 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.32" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.32" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -240,25 +239,25 @@ dependencies = [ [[package]] name = "contract-derive" version = "0.1.0" -source = "git+https://github.com/securesecrets/shade#ae81bce8e1cb42df40b28aa811e9f701a4d78738" +source = "git+https://github.com/securesecrets/shade#93ec008bc7184af9c31fdb26d9242dce64702952" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-derive" -version = "1.5.7" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd85de6467cd1073688c86b39833679ae6db18cf4771471edd9809f15f1679f1" +checksum = "343f5ce9f8f83dc2b3c03cb51ac2d39315ac4defd200d544e5a190726e01d2d5" dependencies = [ "syn 1.0.109", ] [[package]] name = "cosmwasm-schema" -version = "1.5.7" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b4cd28147a66eba73720b47636a58097a979ad8c8bfdb4ed437ebcbfe362576" +checksum = "7d538047f2bab028d3242ff974e64985565cd29faa09af7410d4278bb66e3c99" dependencies = [ "cosmwasm-schema-derive", "schemars 0.8.21", @@ -269,9 +268,9 @@ dependencies = [ [[package]] name = "cosmwasm-schema-derive" -version = "1.5.7" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9acd45c63d41bc9b16bc6dc7f6bd604a8c2ad29ce96c8f3c96d7fc8ef384392e" +checksum = "a098a0ba9dee2e998e2c7e6a842b517de338d39553802cf70493b2473ac55aa2" dependencies = [ "proc-macro2", "quote", @@ -280,18 +279,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -401,9 +400,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" [[package]] name = "ecdsa" @@ -460,9 +459,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "eris_staking_derivatives_oracle" @@ -516,9 +515,9 @@ checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -531,9 +530,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -541,15 +540,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -558,32 +557,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -593,9 +592,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -652,9 +651,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -687,12 +686,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -706,9 +705,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "k256" @@ -724,9 +723,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "lido_staking_derivatives_oracle" @@ -826,9 +825,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "opaque-debug" @@ -871,9 +870,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -919,34 +918,11 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -1011,7 +987,7 @@ dependencies = [ [[package]] name = "query_auth" version = "0.1.0" -source = "git+https://github.com/securesecrets/shade#ae81bce8e1cb42df40b28aa811e9f701a4d78738" +source = "git+https://github.com/securesecrets/shade#93ec008bc7184af9c31fdb26d9242dce64702952" dependencies = [ "schemars 0.7.6", "secret-cosmwasm-std", @@ -1028,9 +1004,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1089,7 +1065,7 @@ checksum = "46aef80f842736de545ada6ec65b81ee91504efd6853f4b96de7414c42ae7443" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] @@ -1159,15 +1135,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "schemars" @@ -1213,7 +1189,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals 0.29.1", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] @@ -1326,6 +1302,18 @@ dependencies = [ "serde", ] +[[package]] +name = "secret-toolkit" +version = "0.10.0" +source = "git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0#9e139bedab9eeb60f2bdbf9d4f1d2bb069886ea9" +dependencies = [ + "secret-toolkit-serialization 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", + "secret-toolkit-snip20 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", + "secret-toolkit-snip721 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", + "secret-toolkit-storage 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", + "secret-toolkit-utils 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", +] + [[package]] name = "secret-toolkit" version = "0.10.0" @@ -1333,11 +1321,11 @@ source = "git+https://github.com/securesecrets/secret-toolkit#9e139bedab9eeb60f2 dependencies = [ "secret-toolkit-crypto", "secret-toolkit-permit", - "secret-toolkit-serialization", - "secret-toolkit-snip20", - "secret-toolkit-snip721", - "secret-toolkit-storage", - "secret-toolkit-utils", + "secret-toolkit-serialization 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "secret-toolkit-snip20 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "secret-toolkit-snip721 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "secret-toolkit-storage 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "secret-toolkit-utils 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", "secret-toolkit-viewing-key", ] @@ -1367,6 +1355,17 @@ dependencies = [ "serde", ] +[[package]] +name = "secret-toolkit-serialization" +version = "0.10.0" +source = "git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0#9e139bedab9eeb60f2bdbf9d4f1d2bb069886ea9" +dependencies = [ + "bincode2", + "schemars 0.8.21", + "secret-cosmwasm-std", + "serde", +] + [[package]] name = "secret-toolkit-serialization" version = "0.10.0" @@ -1378,6 +1377,17 @@ dependencies = [ "serde", ] +[[package]] +name = "secret-toolkit-snip20" +version = "0.10.0" +source = "git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0#9e139bedab9eeb60f2bdbf9d4f1d2bb069886ea9" +dependencies = [ + "schemars 0.8.21", + "secret-cosmwasm-std", + "secret-toolkit-utils 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", + "serde", +] + [[package]] name = "secret-toolkit-snip20" version = "0.10.0" @@ -1385,7 +1395,18 @@ source = "git+https://github.com/securesecrets/secret-toolkit#9e139bedab9eeb60f2 dependencies = [ "schemars 0.8.21", "secret-cosmwasm-std", - "secret-toolkit-utils", + "secret-toolkit-utils 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "serde", +] + +[[package]] +name = "secret-toolkit-snip721" +version = "0.10.0" +source = "git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0#9e139bedab9eeb60f2bdbf9d4f1d2bb069886ea9" +dependencies = [ + "schemars 0.8.21", + "secret-cosmwasm-std", + "secret-toolkit-utils 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", "serde", ] @@ -1396,7 +1417,18 @@ source = "git+https://github.com/securesecrets/secret-toolkit#9e139bedab9eeb60f2 dependencies = [ "schemars 0.8.21", "secret-cosmwasm-std", - "secret-toolkit-utils", + "secret-toolkit-utils 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "serde", +] + +[[package]] +name = "secret-toolkit-storage" +version = "0.10.0" +source = "git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0#9e139bedab9eeb60f2bdbf9d4f1d2bb069886ea9" +dependencies = [ + "secret-cosmwasm-std", + "secret-cosmwasm-storage", + "secret-toolkit-serialization 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", "serde", ] @@ -1407,7 +1439,18 @@ source = "git+https://github.com/securesecrets/secret-toolkit#9e139bedab9eeb60f2 dependencies = [ "secret-cosmwasm-std", "secret-cosmwasm-storage", - "secret-toolkit-serialization", + "secret-toolkit-serialization 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", + "serde", +] + +[[package]] +name = "secret-toolkit-utils" +version = "0.10.0" +source = "git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0#9e139bedab9eeb60f2bdbf9d4f1d2bb069886ea9" +dependencies = [ + "schemars 0.8.21", + "secret-cosmwasm-std", + "secret-cosmwasm-storage", "serde", ] @@ -1432,22 +1475,22 @@ dependencies = [ "secret-cosmwasm-std", "secret-cosmwasm-storage", "secret-toolkit-crypto", - "secret-toolkit-utils", + "secret-toolkit-utils 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", "serde", "subtle", ] [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -1463,13 +1506,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] @@ -1491,14 +1534,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -1598,7 +1641,7 @@ dependencies = [ [[package]] name = "shade-protocol" version = "0.1.0" -source = "git+https://github.com/securesecrets/shade#ae81bce8e1cb42df40b28aa811e9f701a4d78738" +source = "git+https://github.com/securesecrets/shade#93ec008bc7184af9c31fdb26d9242dce64702952" dependencies = [ "base64 0.12.3", "chrono", @@ -1727,7 +1770,7 @@ dependencies = [ "schemars 0.8.21", "secret-cosmwasm-std", "secret-cosmwasm-storage", - "secret-toolkit", + "secret-toolkit 0.10.0 (git+https://github.com/securesecrets/secret-toolkit)", "secret-toolkit-crypto", "serde", "shade-toolkit", @@ -1812,9 +1855,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -1832,36 +1875,24 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] @@ -1883,9 +1914,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "toml_datetime", @@ -1894,9 +1925,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "uint" @@ -1912,15 +1943,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "version_check" @@ -1964,13 +1995,24 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winnow" -version = "0.6.18" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" dependencies = [ "memchr", ] +[[package]] +name = "x_token_oracle" +version = "0.2.0" +dependencies = [ + "cosmwasm-schema", + "secret-cosmwasm-std", + "secret-toolkit 0.10.0 (git+https://github.com/scrtlabs/secret-toolkit?tag=v0.10.0)", + "shade-oracles", + "shade-toolkit", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -1989,7 +2031,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.98", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 687cf89..7725395 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "contracts/mock_ojo", "contracts/oracle_router", "contracts/derivative_oracle", + "contracts/x_token_oracle", "contracts/mock_derivative", "contracts/shade_staking_derivatives_oracle", "contracts/shadeswap_market_oracle", diff --git a/contracts/x_token_oracle/Cargo.toml b/contracts/x_token_oracle/Cargo.toml new file mode 100644 index 0000000..6438991 --- /dev/null +++ b/contracts/x_token_oracle/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "x_token_oracle" +version = "0.2.0" +authors = ["Jackson Swenson "] +edition = "2021" + +exclude = [ + # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. + "contract.wasm", + "hash.txt", +] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +default = [] +# for quicker tests, cargo test --lib + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +shade-oracles = { path = "../../packages/shade_oracles", features = ["core"] } +shade-toolkit = { workspace = true } +secret-toolkit = { git = "https://github.com/scrtlabs/secret-toolkit", tag = "v0.10.0" } diff --git a/contracts/x_token_oracle/src/contract.rs b/contracts/x_token_oracle/src/contract.rs new file mode 100644 index 0000000..eb7e847 --- /dev/null +++ b/contracts/x_token_oracle/src/contract.rs @@ -0,0 +1,222 @@ +use cosmwasm_std::{entry_point, QuerierWrapper, StdError, Uint128, Uint256}; +use cosmwasm_std::{to_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; + +use secret_toolkit::snip20::token_info_query; +use shade_oracles::better_secret_math::common::exp10; +use shade_oracles::core::{pad_query_result, validate_admin, AdminPermissions}; +use shade_oracles::interfaces::common::{OraclePrice, OracleQuery, PriceResponse}; +use shade_oracles::interfaces::providers::ReferenceData; +use shade_oracles::ssp::{Item, Map}; +use shade_toolkit::{Contract, Query, BLOCK_SIZE}; + +use crate::{money_market, msg::*}; + +// Storage +const CONFIG: Item = Item::new("config"); +const KEY_VAULT_MAP: Map = Map::new("key_vault_map"); + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: InstantiateMsg, +) -> StdResult { + CONFIG.save( + deps.storage, + &Config { + admin_auth: msg.admin_auth.validate(deps.api)?, + router: msg.router.validate(deps.api)?, + money_market: msg.money_market.validate(deps.api)?, + enabled: true, + }, + )?; + + Ok(Response::default()) +} + +fn require_enabled(config: &Config) -> StdResult<()> { + if !config.enabled { + return Err(StdError::generic_err("Contract is disabled")); + } + Ok(()) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + let mut config = CONFIG.load(deps.storage)?; + match msg { + ExecuteMsg::UpdateConfig { + router, + money_market, + admin_auth, + enabled, + } => { + validate_admin( + &deps.querier, + AdminPermissions::OraclesAdmin, + info.sender, + &config.admin_auth, + )?; + let mut resp = Response::default(); + if let Some(router) = router { + config.router = router.validate(deps.api)?; + resp = resp.add_attribute("router", config.router.address.clone()); + } + if let Some(admin_auth) = admin_auth { + config.admin_auth = admin_auth.validate(deps.api)?; + resp = resp.add_attribute("admin_auth", config.admin_auth.address.clone()); + } + if let Some(money_market) = money_market { + config.money_market = money_market.validate(deps.api)?; + resp = resp.add_attribute("money_market", config.money_market.address.clone()); + } + if let Some(enabled) = enabled { + config.enabled = enabled; + resp = resp.add_attribute("enabled", config.enabled.to_string()); + } + CONFIG.save(deps.storage, &config)?; + Ok(resp.add_attribute("action", "update_config")) + } + ExecuteMsg::RegisterVault(key_config) => { + validate_admin( + &deps.querier, + AdminPermissions::OraclesAdmin, + info.sender, + &config.admin_auth, + )?; + KEY_VAULT_MAP.save( + deps.storage, + key_config.key, + &deps.api.addr_validate(&key_config.vault)?, + )?; + Ok(Response::default().add_attribute("action", "register_vault")) + } + ExecuteMsg::RegisterVaults(key_configs) => { + validate_admin( + &deps.querier, + AdminPermissions::OraclesAdmin, + info.sender, + &config.admin_auth, + )?; + for KeyConfig { key, vault } in key_configs { + KEY_VAULT_MAP.save(deps.storage, key, &deps.api.addr_validate(&vault)?)?; + } + Ok(Response::default().add_attribute("action", "register_vaults")) + } + } +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { + let config = CONFIG.load(deps.storage)?; + require_enabled(&config)?; + pad_query_result( + match msg { + QueryMsg::GetPrice { key } => to_binary(&query_price(&deps, &env, &config, key)?), + QueryMsg::GetPrices { keys } => { + let mut results = vec![]; + for key in keys { + results.push(query_price(&deps, &env, &config, key)?); + } + to_binary(&results) + } + QueryMsg::GetConfig {} => to_binary(&config), + }, + BLOCK_SIZE, + ) +} + +fn query_price(deps: &Deps, env: &Env, config: &Config, key: String) -> StdResult { + const RATE_SUFFIX: &str = " Rate"; + + let is_rate = key.ends_with(RATE_SUFFIX); + let load_key = if is_rate { + key[..key.len() - RATE_SUFFIX.len()].to_string() + } else { + key.clone() + }; + let vault_addr = KEY_VAULT_MAP + .may_load(deps.storage, load_key.clone()) + .map_err(|_| StdError::generic_err("Key not found"))? + .ok_or_else(|| StdError::generic_err("Key not found"))?; + + let vault = query_vault(&config.money_market, &vault_addr, &deps.querier)?; + + let x_token_info = token_info_query( + deps.querier, + 255, + vault.x_token.code_hash, + vault.x_token.address.to_string(), + )?; + + let total_supply = match x_token_info.total_supply { + Some(supply) => supply, + None => return Err(StdError::generic_err("No total supply")), + }; + + if total_supply.is_zero() { + return Ok(OraclePrice { + key, + data: ReferenceData { + rate: Uint256::zero(), + last_updated_base: env.block.time.seconds(), + last_updated_quote: env.block.time.seconds(), + }, + }); + } + + let backing_balance = vault.loanable + + vault.lent_amount + + (vault.lifetime_interest_owed - vault.lifetime_interest_paid); + + let exchange_rate = (Uint256::from(backing_balance) * Uint256::from(exp10(18).as_u128())) + / Uint256::from(total_supply); + + if is_rate { + Ok(OraclePrice { + key, + data: ReferenceData { + rate: exchange_rate, + last_updated_base: env.block.time.seconds(), + last_updated_quote: env.block.time.seconds(), + }, + }) + } else { + let underlying_price = + query_router_price(&config.router, &deps.querier, vault.oracle_key.clone())?; + Ok(OraclePrice { + key, + data: ReferenceData { + rate: exchange_rate * underlying_price.data.rate + / Uint256::from(exp10(18).as_u128()), + last_updated_base: underlying_price.data.last_updated_base, + last_updated_quote: underlying_price.data.last_updated_quote, + }, + }) + } +} + +pub fn query_router_price( + router: &Contract, + querier: &QuerierWrapper, + key: impl Into, +) -> StdResult { + OracleQuery::GetPrice { key: key.into() }.query(querier, router) +} + +pub fn query_vault( + money_market: &Contract, + vault: &Addr, + querier: &QuerierWrapper, +) -> StdResult { + money_market::QueryMsg::GetVault { + token: vault.to_string(), + } + .query(querier, money_market) +} diff --git a/contracts/x_token_oracle/src/lib.rs b/contracts/x_token_oracle/src/lib.rs new file mode 100644 index 0000000..d7c2250 --- /dev/null +++ b/contracts/x_token_oracle/src/lib.rs @@ -0,0 +1,3 @@ +pub mod contract; +pub mod money_market; +pub mod msg; diff --git a/contracts/x_token_oracle/src/money_market.rs b/contracts/x_token_oracle/src/money_market.rs new file mode 100644 index 0000000..098204e --- /dev/null +++ b/contracts/x_token_oracle/src/money_market.rs @@ -0,0 +1,62 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{ + entry_point, Addr, Decimal, QuerierWrapper, StdError, Storage, Uint128, Uint256, +}; +use cosmwasm_std::{ + to_binary, Binary, ContractInfo, Deps, DepsMut, Env, MessageInfo, Response, StdResult, +}; + +use shade_oracles::better_secret_math::common::exp10; +use shade_oracles::core::{pad_query_result, validate_admin, AdminPermissions, ResponseStatus}; +use shade_oracles::interfaces::common::{OraclePrice, OracleQuery, PriceResponse}; +use shade_oracles::interfaces::providers::ReferenceData; +use shade_oracles::ssp::{Item, Map}; +use shade_toolkit::{Contract, Query, RawContract, BLOCK_SIZE}; + +#[cw_serde] +pub enum QueryMsg { + GetVault { token: String }, +} + +impl Query for QueryMsg { + const BLOCK_SIZE: usize = BLOCK_SIZE; +} + +#[cw_serde] +pub struct VaultState { + pub token: ContractInfo, + pub x_token: ContractInfo, + pub decimals: u8, + pub oracle_key: String, + pub interest: Interest, + pub loanable: Uint128, + pub lent_amount: Uint128, + pub lifetime_interest_paid: Uint128, + pub lifetime_interest_owed: Uint128, + pub interest_per_utoken: Decimal, + pub last_interest_accrued: u64, + pub max_supply: Uint128, + pub max_borrow: Uint128, + pub dao_interest_fee: Decimal, + pub flash_loan_interest: Decimal, + pub dao_flash_loan_interest_fee: Decimal, + pub status: VaultStatus, +} + +#[cw_serde] +pub struct Interest { + pub base: Decimal, + pub slope1: Decimal, + pub slope2: Decimal, + pub optimal_utilization: Decimal, +} + +#[cw_serde] +pub struct VaultStatus { + pub supply_enabled: bool, + pub borrow_enabled: bool, + pub repay_enabled: bool, + pub liquidation_enabled: bool, + pub interest_accrual_enabled: bool, + pub flash_loan_enabled: bool, +} diff --git a/contracts/x_token_oracle/src/msg.rs b/contracts/x_token_oracle/src/msg.rs new file mode 100644 index 0000000..c86e3ea --- /dev/null +++ b/contracts/x_token_oracle/src/msg.rs @@ -0,0 +1,47 @@ +use cosmwasm_schema::cw_serde; + +use cosmwasm_std::Addr; +use shade_oracles::impl_msg_callbacks; +use shade_toolkit::{Contract, RawContract}; + +impl_msg_callbacks!(); + +#[cw_serde] +pub struct Config { + pub router: Contract, + pub admin_auth: Contract, + pub money_market: Contract, + pub enabled: bool, +} + +#[cw_serde] +pub struct KeyConfig { + pub key: String, + pub vault: String, +} + +#[cw_serde] +pub struct InstantiateMsg { + pub router: RawContract, + pub admin_auth: RawContract, + pub money_market: RawContract, +} + +#[cw_serde] +pub enum ExecuteMsg { + UpdateConfig { + router: Option, + admin_auth: Option, + money_market: Option, + enabled: Option, + }, + RegisterVault(KeyConfig), + RegisterVaults(Vec), +} + +#[cw_serde] +pub enum QueryMsg { + GetPrice { key: String }, + GetPrices { keys: Vec }, + GetConfig {}, +} From eb14610ffab1b526461ac10fd974266e9a26e9f5 Mon Sep 17 00:00:00 2001 From: DrPresident Date: Tue, 18 Feb 2025 15:49:02 -0600 Subject: [PATCH 5/5] merge was so borked --- contracts/derivative_oracle/src/contract.rs | 19 ++- contracts/multiplier_oracle/src/contract.rs | 137 -------------------- contracts/multiplier_oracle/src/lib.rs | 4 - contracts/multiplier_oracle/src/msg.rs | 15 --- contracts/x_token_oracle/src/msg.rs | 11 -- 5 files changed, 12 insertions(+), 174 deletions(-) diff --git a/contracts/derivative_oracle/src/contract.rs b/contracts/derivative_oracle/src/contract.rs index 377ee19..c57ff2a 100644 --- a/contracts/derivative_oracle/src/contract.rs +++ b/contracts/derivative_oracle/src/contract.rs @@ -1,7 +1,6 @@ -use cosmwasm_std::{entry_point, Decimal256, QuerierWrapper, StdError, Uint256}; +use cosmwasm_std::{entry_point, QuerierWrapper, StdError, Uint128, Uint256}; use cosmwasm_std::{to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; -use crate::msg::{Config, ExecuteMsg, InstantiateMsg, QueryMsg}; use shade_oracles::better_secret_math::common::exp10; use shade_oracles::core::{pad_query_result, validate_admin, AdminPermissions}; use shade_oracles::interfaces::common::{OraclePrice, OracleQuery, PriceResponse}; @@ -11,6 +10,15 @@ use shade_toolkit::{Contract, Query, BLOCK_SIZE}; use crate::{derivative, msg::*}; +/* +// Key used to query router +pub const UNDERLYING_KEY: &str = "SHD"; +// Key for the "price" (underlying * redemption_rate) +pub const PRICE_KEY: &str = "Shade Derivative"; +// Key for the redemption rate +pub const RATE_KEY: &str = "Shade Derivative Rate"; +*/ + // Storage const CONFIG: Item = Item::new("config"); @@ -63,7 +71,6 @@ pub fn execute( price_key, rate_key, enabled, - multiplier, } => { validate_admin( &deps.querier, @@ -160,10 +167,8 @@ fn query_price(deps: &Deps, env: &Env, config: &Config) -> StdResult>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs // Key used to query router pub const UNDERLYING_KEY: &str = "SHD"; // Key for the "price" (underlying * redemption_rate) pub const PRICE_KEY: &str = "Shade Derivative"; // Key for the redemption rate pub const RATE_KEY: &str = "Shade Derivative Rate"; -*/ // Storage const CONFIG: Item = Item::new("config"); @@ -33,21 +26,6 @@ pub fn instantiate( _info: MessageInfo, msg: InstantiateMsg, ) -> StdResult { -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs - CONFIG.save( - deps.storage, - &Config { - admin_auth: msg.admin_auth.validate(deps.api)?, - router: msg.router.validate(deps.api)?, - derivative: msg.derivative.validate(deps.api)?, - underlying_key: msg.underlying_key, - underlying_decimals: msg.underlying_decimals, - price_key: msg.price_key, - rate_key: msg.rate_key, - enabled: true, - }, - )?; -======== let admin_auth = msg.admin_auth.validate(deps.api)?; let router = msg.router.validate(deps.api)?; @@ -61,7 +39,6 @@ pub fn instantiate( }; CONFIG.save(deps.storage, &config)?; ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs Ok(Response::default()) } @@ -84,15 +61,7 @@ pub fn execute( match msg { ExecuteMsg::UpdateConfig { router, -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs - derivative, -======== ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs admin_auth, - underlying_key, - underlying_decimals, - price_key, - rate_key, enabled, multiplier, } => { @@ -111,32 +80,6 @@ pub fn execute( config.admin_auth = admin_auth.validate(deps.api)?; resp = resp.add_attribute("admin_auth", config.admin_auth.address.clone()); } -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs - if let Some(derivative) = derivative { - config.derivative = derivative.validate(deps.api)?; - resp = resp.add_attribute("derivative", config.derivative.address.clone()); - } - if let Some(underlying_key) = underlying_key { - config.underlying_key = underlying_key; - resp = resp.add_attribute("underlying_key", config.underlying_key.clone()); - } - if let Some(underlying_decimals) = underlying_decimals { - config.underlying_decimals = underlying_decimals; - resp = resp.add_attribute( - "underlying_decimals", - config.underlying_decimals.to_string(), - ); - } - if let Some(price_key) = price_key { - config.price_key = price_key; - resp = resp.add_attribute("price_key", config.price_key.clone()); - } - if let Some(rate_key) = rate_key { - config.rate_key = rate_key; - resp = resp.add_attribute("rate_key", config.rate_key.clone()); - } -======== ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs if let Some(enabled) = enabled { config.enabled = enabled; resp = resp.add_attribute("enabled", config.enabled.to_string()); @@ -157,15 +100,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { require_enabled(&config)?; pad_query_result( match msg { -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs - QueryMsg::GetPrice { key } => { - to_binary(&query_oracle_price_by_key(&deps, &env, key, &config)?) - } - QueryMsg::GetPrices { keys } => { - let mut results = vec![]; - for key in keys { - results.push(query_oracle_price_by_key(&deps, &env, key, &config)?); -======== QueryMsg::GetPrice { key } => to_binary(&query_oracle_price_by_key( &deps, &env, @@ -187,7 +121,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { &config.price_key, &config.multiplier, )?); ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs } to_binary(&results) } @@ -201,18 +134,6 @@ fn query_oracle_price_by_key( deps: &Deps, env: &Env, key: String, -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs - config: &Config, -) -> StdResult { - if key == config.price_key.to_string() { - query_price(deps, env, config) - } else if key == config.rate_key.to_string() { - query_rate(deps, env, config) - } else { - Err(StdError::generic_err(format!( - "Invalid Key, expected one of {}, {}", - config.price_key, config.rate_key -======== router: &Contract, base_key: &String, price_key: &String, @@ -224,19 +145,10 @@ fn query_oracle_price_by_key( Err(StdError::generic_err(format!( "Invalid Key, expected {}", price_key, ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs ))) } } -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs -fn query_price(deps: &Deps, env: &Env, config: &Config) -> StdResult { - let underlying_price = - query_router_price(&config.router, &deps.querier, config.underlying_key.clone())?; - let rate = query_rate(deps, env, config)?; - Ok(OraclePrice { - key: config.price_key.to_string(), -======== fn query_price( deps: &Deps, env: &Env, @@ -248,7 +160,6 @@ fn query_price( let underlying_price = query_router_price(&router, &deps.querier, base_key.to_string())?; Ok(OraclePrice { key: price_key.to_string(), ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs data: ReferenceData { rate: ((Decimal256::from_ratio(underlying_price.data.rate, exp10(18).as_u128()) * multiplier) @@ -260,26 +171,6 @@ fn query_price( }) } -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs -fn query_rate(deps: &Deps, env: &Env, config: &Config) -> StdResult { - let staking_info = query_staking_info(&config.derivative, &deps.querier)?; - let now = env.block.time.seconds(); - // normalize from 10^6 to 10^18 - Ok(OraclePrice { - key: config.rate_key.to_string(), - data: ReferenceData { - // price is in utkn, upscaling by 10^(18-decimals) to get 10^18 - rate: Uint256::from( - staking_info.price * Uint128::new(exp10(18 - config.underlying_decimals).as_u128()), - ), - last_updated_base: now, - last_updated_quote: now, - }, - }) -} - -======== ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs pub fn query_router_price( router: &Contract, querier: &QuerierWrapper, @@ -287,31 +178,3 @@ pub fn query_router_price( ) -> StdResult { OracleQuery::GetPrice { key: key.into() }.query(querier, router) } -<<<<<<<< HEAD:contracts/derivative_oracle/src/contract.rs - -pub fn query_staking_info( - derivative: &Contract, - querier: &QuerierWrapper, -) -> StdResult { - match (derivative::QueryMsg::StakingInfo {}.query(querier, derivative)?) { - derivative::QueryResponse::StakingInfo { - unbonding_time, - bonded_shd, - rewards, - total_derivative_token_supply, - price, - fee_info, - status, - } => Ok(derivative::StakingInfoResponse { - unbonding_time, - bonded_shd, - rewards, - total_derivative_token_supply, - price, - fee_info, - status, - }), - } -} -======== ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/contract.rs diff --git a/contracts/multiplier_oracle/src/lib.rs b/contracts/multiplier_oracle/src/lib.rs index afcfbc6..112ecad 100644 --- a/contracts/multiplier_oracle/src/lib.rs +++ b/contracts/multiplier_oracle/src/lib.rs @@ -1,6 +1,2 @@ pub mod contract; -<<<<<<<< HEAD:contracts/derivative_oracle/src/lib.rs -pub mod derivative; -======== ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/lib.rs pub mod msg; diff --git a/contracts/multiplier_oracle/src/msg.rs b/contracts/multiplier_oracle/src/msg.rs index 616828b..0953e89 100644 --- a/contracts/multiplier_oracle/src/msg.rs +++ b/contracts/multiplier_oracle/src/msg.rs @@ -1,7 +1,6 @@ use cosmwasm_schema::cw_serde; use cosmwasm_std::Decimal256; -use cosmwasm_std::Addr; use shade_oracles::impl_msg_callbacks; use shade_toolkit::{Contract, RawContract}; @@ -11,7 +10,6 @@ impl_msg_callbacks!(); pub struct Config { pub router: Contract, pub admin_auth: Contract, - pub money_market: Contract, pub enabled: bool, // base asset to apply multiplier to pub base_key: String, @@ -19,23 +17,13 @@ pub struct Config { pub price_key: String, } -#[cw_serde] -pub struct KeyConfig { - pub key: String, - pub vault: String, -} - #[cw_serde] pub struct InstantiateMsg { pub router: RawContract, pub admin_auth: RawContract, -<<<<<<<< HEAD:contracts/x_token_oracle/src/msg.rs - pub money_market: RawContract, -======== pub base_key: String, pub multiplier: Decimal256, pub price_key: String, ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/msg.rs } #[cw_serde] @@ -43,12 +31,9 @@ pub enum ExecuteMsg { UpdateConfig { router: Option, admin_auth: Option, - money_market: Option, enabled: Option, multiplier: Option, }, - RegisterVault(KeyConfig), - RegisterVaults(Vec), } #[cw_serde] diff --git a/contracts/x_token_oracle/src/msg.rs b/contracts/x_token_oracle/src/msg.rs index 616828b..1c0e07f 100644 --- a/contracts/x_token_oracle/src/msg.rs +++ b/contracts/x_token_oracle/src/msg.rs @@ -13,10 +13,6 @@ pub struct Config { pub admin_auth: Contract, pub money_market: Contract, pub enabled: bool, - // base asset to apply multiplier to - pub base_key: String, - pub multiplier: Decimal256, - pub price_key: String, } #[cw_serde] @@ -29,13 +25,7 @@ pub struct KeyConfig { pub struct InstantiateMsg { pub router: RawContract, pub admin_auth: RawContract, -<<<<<<<< HEAD:contracts/x_token_oracle/src/msg.rs pub money_market: RawContract, -======== - pub base_key: String, - pub multiplier: Decimal256, - pub price_key: String, ->>>>>>>> origin/develop:contracts/multiplier_oracle/src/msg.rs } #[cw_serde] @@ -45,7 +35,6 @@ pub enum ExecuteMsg { admin_auth: Option, money_market: Option, enabled: Option, - multiplier: Option, }, RegisterVault(KeyConfig), RegisterVaults(Vec),