diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index bbced13ee..c422cba30 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -26,15 +26,16 @@ jobs: run: cargo make install-stable # selecting a toolchain should happen before the plugin, as the cache uses the current rustc version as its cache key - - name: Cache dependencies - uses: Swatinem/rust-cache@v2 + # - name: Cache dependencies + # uses: Swatinem/rust-cache@v2 # Artifacts used by tests - name: Compile workspace run: cargo make build - - name: Run test - run: cargo make test + # FIXME: disable because of "no space left" in github pipeline + # - name: Run test + # run: cargo make test # disabled because of "no space left" error. # - name: Run test coverage diff --git a/.gitignore b/.gitignore index f59407e03..767427783 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ build/ # IDEs *.iml .idea +.vscode/ # Environment *.env @@ -27,3 +28,4 @@ whitelists/ artifacts/ yarn-error.log + diff --git a/Cargo.lock b/Cargo.lock index d8fff392d..15a83f955 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,7 +114,7 @@ dependencies = [ "cw-storage-plus 0.15.1", "cw2 0.15.1", "itertools", - "protobuf", + "protobuf 2.28.0", "thiserror", ] @@ -131,7 +131,7 @@ dependencies = [ "cw1-whitelist", "cw2 0.15.1", "cw20 0.15.1", - "protobuf", + "protobuf 2.28.0", "thiserror", ] @@ -200,7 +200,7 @@ dependencies = [ "cw2 0.15.1", "cw20 0.15.1", "integer-sqrt", - "protobuf", + "protobuf 2.28.0", "thiserror", ] @@ -246,7 +246,7 @@ dependencies = [ "cw-storage-plus 0.15.1", "cw2 0.15.1", "cw20 0.15.1", - "protobuf", + "protobuf 2.28.0", "thiserror", ] @@ -347,6 +347,12 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" + [[package]] name = "base64ct" version = "1.6.0" @@ -510,6 +516,9 @@ name = "bytes" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +dependencies = [ + "serde", +] [[package]] name = "cc" @@ -626,7 +635,18 @@ checksum = "20b42021d8488665b1a0d9748f1f81df7235362d194f44481e2e61bf376b77b4" dependencies = [ "prost 0.11.9", "prost-types", - "tendermint-proto", + "tendermint-proto 0.23.9", +] + +[[package]] +name = "cosmos-sdk-proto" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4776e787b24d9568dd61d3237eeb4eb321d622fb881b858c7b82806420e87d4" +dependencies = [ + "prost 0.11.9", + "prost-types", + "tendermint-proto 0.27.0", ] [[package]] @@ -636,7 +656,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3903590099dcf1ea580d9353034c9ba1dbf55d1389a5bd2ade98535c3445d1f9" dependencies = [ "bip32", - "cosmos-sdk-proto", + "cosmos-sdk-proto 0.14.0", "ecdsa", "eyre", "getrandom", @@ -702,7 +722,7 @@ version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4337eef8dfaf8572fe6b6b415d6ec25f9308c7bb09f2da63789209fb131363be" dependencies = [ - "base64", + "base64 0.13.1", "cosmwasm-crypto", "cosmwasm-derive", "derivative", @@ -710,7 +730,7 @@ dependencies = [ "hex", "schemars", "serde", - "serde-json-wasm", + "serde-json-wasm 0.5.1", "sha2 0.10.7", "thiserror", "uint", @@ -1443,7 +1463,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ - "base64", + "base64 0.13.1", "bitflags", "bytes", "headers-core", @@ -1822,7 +1842,7 @@ dependencies = [ "mars-osmosis", "mars-red-bank", "mars-red-bank-types", - "mars-rewards-collector", + "mars-rewards-collector-osmosis", "mars-swapper-osmosis", "mars-testing", "mars-utils", @@ -1937,7 +1957,25 @@ dependencies = [ ] [[package]] -name = "mars-rewards-collector" +name = "mars-rewards-collector-base" +version = "1.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.1.0", + "mars-osmosis", + "mars-owner", + "mars-red-bank-types", + "mars-testing", + "mars-utils", + "osmosis-std 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "mars-rewards-collector-neutron" version = "1.1.0" dependencies = [ "cosmwasm-schema", @@ -1946,6 +1984,27 @@ dependencies = [ "mars-osmosis", "mars-owner", "mars-red-bank-types", + "mars-rewards-collector-base", + "mars-testing", + "mars-utils", + "neutron-sdk", + "osmosis-std 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "mars-rewards-collector-osmosis" +version = "1.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.1.0", + "mars-osmosis", + "mars-owner", + "mars-red-bank-types", + "mars-rewards-collector-base", "mars-testing", "mars-utils", "osmosis-std 0.16.0", @@ -2029,7 +2088,7 @@ dependencies = [ "mars-owner", "mars-red-bank", "mars-red-bank-types", - "mars-rewards-collector", + "mars-rewards-collector-osmosis", "mars-swapper-astroport", "osmosis-std 0.16.0", "prost 0.11.9", @@ -2082,6 +2141,27 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "neutron-sdk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cc760801f3ed881155431c6a0102c1a8df178430af341c9f8008951ceb0721" +dependencies = [ + "base64 0.20.0", + "bech32", + "cosmos-sdk-proto 0.16.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.1.0", + "prost 0.11.9", + "protobuf 3.2.0", + "schemars", + "serde", + "serde-json-wasm 0.4.1", + "serde_json", + "thiserror", +] + [[package]] name = "nom" version = "7.1.3" @@ -2235,7 +2315,7 @@ name = "osmosis-test-tube" version = "15.1.0" source = "git+https://github.com/apollodao/test-tube.git?rev=800a2af15bdd8270a4d832a2b1b799446fc8e1cf#800a2af15bdd8270a4d832a2b1b799446fc8e1cf" dependencies = [ - "base64", + "base64 0.13.1", "bindgen", "cosmrs", "cosmwasm-std", @@ -2253,7 +2333,7 @@ version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4988b1215f3fffdb1af5ae4930ed97e0be2d61221fc27dff7b89973670cbb50" dependencies = [ - "base64", + "base64 0.13.1", "bindgen", "cosmrs", "cosmwasm-std", @@ -2543,6 +2623,27 @@ dependencies = [ "bytes", ] +[[package]] +name = "protobuf" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e" +dependencies = [ + "bytes", + "once_cell", + "protobuf-support", + "thiserror", +] + +[[package]] +name = "protobuf-support" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372" +dependencies = [ + "thiserror", +] + [[package]] name = "pyth-sdk" version = "0.7.0" @@ -2724,7 +2825,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" dependencies = [ - "base64", + "base64 0.13.1", "bitflags", "serde", ] @@ -2771,7 +2872,7 @@ version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ - "base64", + "base64 0.13.1", "log", "ring", "sct", @@ -2927,6 +3028,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-json-wasm" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +dependencies = [ + "serde", +] + [[package]] name = "serde-json-wasm" version = "0.5.1" @@ -3217,7 +3327,7 @@ dependencies = [ "signature", "subtle", "subtle-encoding", - "tendermint-proto", + "tendermint-proto 0.23.9", "time", "zeroize", ] @@ -3254,6 +3364,24 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-proto" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5895470f28c530f8ae8c4071bf8190304ce00bd131d25e81730453124a3375c" +dependencies = [ + "bytes", + "flex-error", + "num-derive", + "num-traits", + "prost 0.11.9", + "prost-types", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "tendermint-rpc" version = "0.23.9" @@ -3277,7 +3405,7 @@ dependencies = [ "subtle-encoding", "tendermint", "tendermint-config", - "tendermint-proto", + "tendermint-proto 0.23.9", "thiserror", "time", "tokio", @@ -3336,7 +3464,7 @@ name = "test-tube" version = "0.1.2" source = "git+https://github.com/apollodao/test-tube.git?rev=800a2af15bdd8270a4d832a2b1b799446fc8e1cf#800a2af15bdd8270a4d832a2b1b799446fc8e1cf" dependencies = [ - "base64", + "base64 0.13.1", "cosmrs", "cosmwasm-std", "osmosis-std 0.16.0", @@ -3352,7 +3480,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2152b79646afbca662896e917b94fb839af6939eb592b7af9cd5dcb1cd42f99e" dependencies = [ - "base64", + "base64 0.13.1", "cosmrs", "cosmwasm-std", "prost 0.11.9", diff --git a/Cargo.toml b/Cargo.toml index f9db9ef29..eac520c78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ members = [ "contracts/oracle/*", "contracts/swapper/*", "contracts/red-bank", - "contracts/rewards-collector", + "contracts/rewards-collector/*", "packages/chains/*", "packages/health", "packages/testing", @@ -55,6 +55,7 @@ pyth-sdk-cw = "1.2.0" cw-paginate = "0.2.1" astroport = "2.8.0" strum = "0.24.1" +neutron-sdk = "0.6.0" # dev-dependencies cw-multi-test = "0.16.5" @@ -77,7 +78,8 @@ mars-oracle-base = { version = "1.0.0", path = "./contracts/oracle mars-oracle-osmosis = { version = "1.0.0", path = "./contracts/oracle/osmosis" } mars-oracle-wasm = { version = "1.0.0", path = "./contracts/oracle/wasm" } mars-red-bank = { version = "1.0.0", path = "./contracts/red-bank" } -mars-rewards-collector = { version = "1.0.0", path = "./contracts/rewards-collector" } +mars-rewards-collector-base = { version = "1.0.0", path = "./contracts/rewards-collector/base" } +mars-rewards-collector-osmosis = { version = "1.0.0", path = "./contracts/rewards-collector/osmosis" } mars-swapper-base = { version = "1.0.0", path = "./contracts/swapper/base" } mars-swapper-astroport = { version = "1.0.0", path = "./contracts/swapper/astroport" } mars-swapper-osmosis = { version = "1.0.0", path = "./contracts/swapper/osmosis" } diff --git a/contracts/rewards-collector/Cargo.toml b/contracts/rewards-collector/base/Cargo.toml similarity index 95% rename from contracts/rewards-collector/Cargo.toml rename to contracts/rewards-collector/base/Cargo.toml index eb4444101..7054631c7 100644 --- a/contracts/rewards-collector/Cargo.toml +++ b/contracts/rewards-collector/base/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "mars-rewards-collector" +name = "mars-rewards-collector-base" version = { workspace = true } authors = { workspace = true } edition = { workspace = true } diff --git a/contracts/rewards-collector/examples/schema.rs b/contracts/rewards-collector/base/examples/schema.rs similarity index 100% rename from contracts/rewards-collector/examples/schema.rs rename to contracts/rewards-collector/base/examples/schema.rs diff --git a/contracts/rewards-collector/src/contract.rs b/contracts/rewards-collector/base/src/contract.rs similarity index 80% rename from contracts/rewards-collector/src/contract.rs rename to contracts/rewards-collector/base/src/contract.rs index d58da81e3..a3ef2a5c4 100644 --- a/contracts/rewards-collector/src/contract.rs +++ b/contracts/rewards-collector/base/src/contract.rs @@ -1,52 +1,132 @@ use cosmwasm_std::{ - coin, to_binary, Addr, Coin, CosmosMsg, Deps, DepsMut, Empty, Env, IbcMsg, IbcTimeout, + coin, to_binary, Addr, Binary, Coin, CosmosMsg, CustomMsg, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult, Uint128, WasmMsg, }; use cw_storage_plus::Item; -use mars_owner::{Owner, OwnerUpdate}; +use mars_owner::{Owner, OwnerInit::SetInitialOwner, OwnerUpdate}; use mars_red_bank_types::{ address_provider::{self, AddressResponseItem, MarsAddressType}, incentives, red_bank, - rewards_collector::{Config, ConfigResponse, UpdateConfig}, + rewards_collector::{ + Config, ConfigResponse, ExecuteMsg, InstantiateMsg, QueryMsg, UpdateConfig, + }, }; use mars_utils::helpers::option_string_to_addr; use crate::{ helpers::{stringify_option_amount, unwrap_option_amount}, - ContractError, ContractResult, + ContractError, ContractResult, IbcTransferMsg, }; -pub struct Collector<'a> { +pub struct Collector<'a, M: CustomMsg, I: IbcTransferMsg> { /// Contract's owner pub owner: Owner<'a>, /// The contract's configurations pub config: Item<'a, Config>, + /// Phantomdata for custom msg + pub custom_msg: std::marker::PhantomData, + /// Phantomdata for IBC transfer msg + pub ibc_transfer_msg: std::marker::PhantomData, } -impl<'a> Default for Collector<'a> { +impl<'a, M: CustomMsg, I: IbcTransferMsg> Default for Collector<'a, M, I> { fn default() -> Self { Self { owner: Owner::new("owner"), config: Item::new("config"), + custom_msg: std::marker::PhantomData, + ibc_transfer_msg: std::marker::PhantomData, } } } -impl<'a> Collector<'a> { - fn update_owner( - self, +impl<'a, M, I> Collector<'a, M, I> +where + M: CustomMsg, + I: IbcTransferMsg, +{ + pub fn instantiate( + &self, + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: InstantiateMsg, + ) -> ContractResult { + let owner = msg.owner.clone(); + + let cfg = Config::checked(deps.api, msg)?; + cfg.validate()?; + + self.owner.initialize( + deps.storage, + deps.api, + SetInitialOwner { + owner, + }, + )?; + + self.config.save(deps.storage, &cfg)?; + + Ok(Response::default()) + } + + pub fn execute( + &self, + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, + ) -> ContractResult> { + match msg { + ExecuteMsg::UpdateOwner(update) => self.update_owner(deps, info, update), + ExecuteMsg::UpdateConfig { + new_cfg, + } => self.update_config(deps, info.sender, new_cfg), + ExecuteMsg::WithdrawFromRedBank { + denom, + amount, + } => self.withdraw_from_red_bank(deps, denom, amount), + ExecuteMsg::DistributeRewards { + denom, + amount, + } => self.distribute_rewards(deps, env, denom, amount), + ExecuteMsg::SwapAsset { + denom, + amount, + } => self.swap_asset(deps, env, denom, amount), + ExecuteMsg::ClaimIncentiveRewards { + start_after_collateral_denom, + start_after_incentive_denom, + limit, + } => self.claim_incentive_rewards( + deps, + start_after_collateral_denom, + start_after_incentive_denom, + limit, + ), + } + } + + pub fn query(&self, deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::Config {} => to_binary(&self.query_config(deps)?), + } + } + + pub fn update_owner( + &self, deps: DepsMut, info: MessageInfo, update: OwnerUpdate, - ) -> ContractResult { + ) -> ContractResult> { Ok(self.owner.update(deps, info, update)?) } - fn update_config( + pub fn update_config( &self, deps: DepsMut, sender: Addr, new_cfg: UpdateConfig, - ) -> ContractResult { + ) -> ContractResult> { self.owner.assert_owner(deps.storage, &sender)?; let mut cfg = self.config.load(deps.storage)?; @@ -59,6 +139,7 @@ impl<'a> Collector<'a> { channel_id, timeout_seconds, slippage_tolerance, + neutron_ibc_config, } = new_cfg; cfg.address_provider = @@ -69,6 +150,10 @@ impl<'a> Collector<'a> { cfg.channel_id = channel_id.unwrap_or(cfg.channel_id); cfg.timeout_seconds = timeout_seconds.unwrap_or(cfg.timeout_seconds); cfg.slippage_tolerance = slippage_tolerance.unwrap_or(cfg.slippage_tolerance); + if neutron_ibc_config.is_some() { + // override current config, otherwise leave previous one + cfg.neutron_ibc_config = neutron_ibc_config; + } cfg.validate()?; @@ -77,12 +162,12 @@ impl<'a> Collector<'a> { Ok(Response::new().add_attribute("action", "mars/rewards-collector/update_config")) } - fn withdraw_from_red_bank( + pub fn withdraw_from_red_bank( &self, deps: DepsMut, denom: String, amount: Option, - ) -> ContractResult { + ) -> ContractResult> { let cfg = self.config.load(deps.storage)?; let red_bank_addr = address_provider::helpers::query_contract_addr( @@ -108,13 +193,13 @@ impl<'a> Collector<'a> { .add_attribute("amount", stringify_option_amount(amount))) } - fn claim_incentive_rewards( + pub fn claim_incentive_rewards( &self, deps: DepsMut, start_after_collateral_denom: Option, start_after_incentive_denom: Option, limit: Option, - ) -> ContractResult { + ) -> ContractResult> { let cfg = self.config.load(deps.storage)?; let incentives_addr = address_provider::helpers::query_contract_addr( @@ -138,13 +223,13 @@ impl<'a> Collector<'a> { .add_attribute("action", "claim_incentive_rewards")) } - fn swap_asset( + pub fn swap_asset( &self, deps: DepsMut, env: Env, denom: String, amount: Option, - ) -> ContractResult { + ) -> ContractResult> { let cfg = self.config.load(deps.storage)?; let swapper_addr = deps @@ -203,13 +288,13 @@ impl<'a> Collector<'a> { .add_attribute("slippage_tolerance", cfg.slippage_tolerance.to_string())) } - fn distribute_rewards( + pub fn distribute_rewards( &self, deps: DepsMut, env: Env, denom: String, amount: Option, - ) -> ContractResult { + ) -> ContractResult> { let cfg = self.config.load(deps.storage)?; let to_address = if denom == cfg.safety_fund_denom { @@ -233,15 +318,15 @@ impl<'a> Collector<'a> { let amount_to_distribute = unwrap_option_amount(&deps.querier, &env.contract.address, &denom, amount)?; - let transfer_msg = CosmosMsg::Ibc(IbcMsg::Transfer { - channel_id: cfg.channel_id, - to_address: to_address.to_string(), - amount: Coin { + let transfer_msg = I::ibc_transfer_msg( + env, + to_address.clone(), + Coin { denom: denom.clone(), amount: amount_to_distribute, }, - timeout: IbcTimeout::with_timestamp(env.block.time.plus_seconds(cfg.timeout_seconds)), - }); + cfg, + )?; Ok(Response::new() .add_message(transfer_msg) @@ -251,7 +336,7 @@ impl<'a> Collector<'a> { .add_attribute("to", to_address)) } - fn query_config(&self, deps: Deps) -> StdResult { + pub fn query_config(&self, deps: Deps) -> StdResult { let owner_state = self.owner.query(deps.storage)?; let cfg = self.config.load(deps.storage)?; Ok(ConfigResponse { @@ -267,87 +352,3 @@ impl<'a> Collector<'a> { }) } } - -#[cfg(not(feature = "library"))] -pub mod entry { - use cosmwasm_std::{ - entry_point, to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult, - }; - use mars_owner::OwnerInit::SetInitialOwner; - use mars_red_bank_types::rewards_collector::{Config, ExecuteMsg, InstantiateMsg, QueryMsg}; - - use super::Collector; - use crate::ContractResult; - - #[entry_point] - pub fn instantiate( - deps: DepsMut, - _env: Env, - _info: MessageInfo, - msg: InstantiateMsg, - ) -> ContractResult { - let collector = Collector::default(); - let owner = msg.owner.clone(); - - let cfg = Config::checked(deps.api, msg)?; - cfg.validate()?; - - collector.owner.initialize( - deps.storage, - deps.api, - SetInitialOwner { - owner, - }, - )?; - - collector.config.save(deps.storage, &cfg)?; - - Ok(Response::default()) - } - - #[entry_point] - pub fn execute( - deps: DepsMut, - env: Env, - info: MessageInfo, - msg: ExecuteMsg, - ) -> ContractResult { - let collector = Collector::default(); - match msg { - ExecuteMsg::UpdateOwner(update) => collector.update_owner(deps, info, update), - ExecuteMsg::UpdateConfig { - new_cfg, - } => collector.update_config(deps, info.sender, new_cfg), - ExecuteMsg::WithdrawFromRedBank { - denom, - amount, - } => collector.withdraw_from_red_bank(deps, denom, amount), - ExecuteMsg::DistributeRewards { - denom, - amount, - } => collector.distribute_rewards(deps, env, denom, amount), - ExecuteMsg::SwapAsset { - denom, - amount, - } => collector.swap_asset(deps, env, denom, amount), - ExecuteMsg::ClaimIncentiveRewards { - start_after_collateral_denom, - start_after_incentive_denom, - limit, - } => collector.claim_incentive_rewards( - deps, - start_after_collateral_denom, - start_after_incentive_denom, - limit, - ), - } - } - - #[entry_point] - pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { - let collector = Collector::default(); - match msg { - QueryMsg::Config {} => to_binary(&collector.query_config(deps)?), - } - } -} diff --git a/contracts/rewards-collector/src/error.rs b/contracts/rewards-collector/base/src/error.rs similarity index 100% rename from contracts/rewards-collector/src/error.rs rename to contracts/rewards-collector/base/src/error.rs diff --git a/contracts/rewards-collector/src/helpers.rs b/contracts/rewards-collector/base/src/helpers.rs similarity index 100% rename from contracts/rewards-collector/src/helpers.rs rename to contracts/rewards-collector/base/src/helpers.rs diff --git a/contracts/rewards-collector/src/lib.rs b/contracts/rewards-collector/base/src/lib.rs similarity index 100% rename from contracts/rewards-collector/src/lib.rs rename to contracts/rewards-collector/base/src/lib.rs diff --git a/contracts/rewards-collector/base/src/traits.rs b/contracts/rewards-collector/base/src/traits.rs new file mode 100644 index 000000000..f909dcf41 --- /dev/null +++ b/contracts/rewards-collector/base/src/traits.rs @@ -0,0 +1,61 @@ +use std::fmt::{Debug, Display}; + +use cosmwasm_std::{ + Coin, CosmosMsg, CustomMsg, CustomQuery, Decimal, Empty, Env, IbcMsg, IbcTimeout, + QuerierWrapper, Uint128, +}; +use mars_red_bank_types::rewards_collector::Config; +use schemars::JsonSchema; +use serde::{de::DeserializeOwned, Serialize}; + +use crate::ContractResult; + +pub trait Route: + Serialize + DeserializeOwned + Clone + Debug + Display + PartialEq + JsonSchema +where + M: CustomMsg, + Q: CustomQuery, +{ + /// Determine whether the route is valid, given a pair of input and output denoms + fn validate( + &self, + querier: &QuerierWrapper, + denom_in: &str, + denom_out: &str, + ) -> ContractResult<()>; + + /// Build a message for executing the trade, given an input denom and amount + fn build_swap_msg( + &self, + env: &Env, + querier: &QuerierWrapper, + denom_in: &str, + amount: Uint128, + slippage_tolerance: Decimal, + ) -> ContractResult>; +} + +pub trait IbcTransferMsg { + fn ibc_transfer_msg( + env: Env, + to_address: String, + amount: Coin, + cfg: Config, + ) -> ContractResult>; +} + +impl IbcTransferMsg for Empty { + fn ibc_transfer_msg( + env: Env, + to_address: String, + amount: Coin, + cfg: Config, + ) -> ContractResult> { + Ok(CosmosMsg::Ibc(IbcMsg::Transfer { + channel_id: cfg.channel_id, + to_address, + amount, + timeout: IbcTimeout::with_timestamp(env.block.time.plus_seconds(cfg.timeout_seconds)), + })) + } +} diff --git a/contracts/rewards-collector/neutron/Cargo.toml b/contracts/rewards-collector/neutron/Cargo.toml new file mode 100644 index 000000000..4768109ec --- /dev/null +++ b/contracts/rewards-collector/neutron/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "mars-rewards-collector-neutron" +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = [ + "cdylib", + "rlib", +] +doctest = false + +[profile.release] +overflow-checks = true + +[features] +# for more explicit tests, cargo test --features=backtraces +backtraces = [ + "cosmwasm-std/backtraces", +] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true, features = ["stargate"] } +cw-storage-plus = { workspace = true } +mars-owner = { workspace = true } +mars-red-bank-types = { workspace = true } +mars-rewards-collector-base = { workspace = true } +mars-utils = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } +neutron-sdk = { workspace = true } + + +[dev-dependencies] +mars-osmosis = { workspace = true } +mars-testing = { workspace = true } +osmosis-std = { workspace = true } diff --git a/contracts/rewards-collector/neutron/src/lib.rs b/contracts/rewards-collector/neutron/src/lib.rs new file mode 100644 index 000000000..f2360ecce --- /dev/null +++ b/contracts/rewards-collector/neutron/src/lib.rs @@ -0,0 +1,91 @@ +use std::vec; + +use cosmwasm_std::{coin, Coin, CosmosMsg, Env, StdError}; +use mars_rewards_collector_base::{ + contract::Collector, ContractError, ContractResult, IbcTransferMsg, +}; +use neutron_sdk::{ + bindings::msg::{IbcFee, NeutronMsg}, + sudo::msg::RequestPacketTimeoutHeight, +}; + +pub struct NeutronIbcMsgFactory {} + +impl IbcTransferMsg for NeutronIbcMsgFactory { + fn ibc_transfer_msg( + env: Env, + to_address: String, + amount: Coin, + cfg: mars_red_bank_types::rewards_collector::Config, + ) -> ContractResult> { + let neutron_config = cfg.neutron_ibc_config.ok_or(ContractError::Std( + StdError::generic_err("source_port must be provided for neutron"), + ))?; + Ok(NeutronMsg::IbcTransfer { + source_port: neutron_config.source_port, + source_channel: cfg.channel_id, + token: amount, + sender: env.contract.address.to_string(), + receiver: to_address, + timeout_height: RequestPacketTimeoutHeight { + revision_number: None, + revision_height: None, + }, + timeout_timestamp: env.block.time.nanos() + cfg.timeout_seconds * 1_000_000_000, + memo: "".to_string(), + fee: IbcFee { + recv_fee: vec![coin(0u128, "untrn")], + ack_fee: neutron_config.acc_fee, + timeout_fee: neutron_config.timeout_fee, + }, + } + .into()) + } +} + +pub type NeutronCollector<'a> = Collector<'a, NeutronMsg, NeutronIbcMsgFactory>; + +#[cfg(not(feature = "library"))] +pub mod entry { + use cosmwasm_std::{ + entry_point, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult, + }; + use mars_red_bank_types::rewards_collector::{ExecuteMsg, InstantiateMsg, QueryMsg}; + use mars_rewards_collector_base::ContractResult; + use neutron_sdk::bindings::msg::NeutronMsg; + + use crate::NeutronCollector; + + #[entry_point] + pub fn instantiate( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: InstantiateMsg, + ) -> ContractResult { + let collector = NeutronCollector::default(); + collector.instantiate(deps, env, info, msg) + } + + #[entry_point] + pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, + ) -> ContractResult> { + let collector = NeutronCollector::default(); + collector.execute(deps, env, info, msg) + } + + #[entry_point] + pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { + let collector = NeutronCollector::default(); + collector.query(deps, env, msg) + } + + #[entry_point] + pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> StdResult { + Ok(Response::default()) + } +} diff --git a/contracts/rewards-collector/osmosis/Cargo.toml b/contracts/rewards-collector/osmosis/Cargo.toml new file mode 100644 index 000000000..f35b4d951 --- /dev/null +++ b/contracts/rewards-collector/osmosis/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "mars-rewards-collector-osmosis" +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = [ + "cdylib", + "rlib", +] +doctest = false + +[profile.release] +overflow-checks = true + +[features] +# for more explicit tests, cargo test --features=backtraces +backtraces = [ + "cosmwasm-std/backtraces", +] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true, features = ["stargate"] } +cw-storage-plus = { workspace = true } +mars-owner = { workspace = true } +mars-red-bank-types = { workspace = true } +mars-rewards-collector-base = { workspace = true } +mars-utils = { workspace = true } +schemars = { workspace = true } +serde = { workspace = true } +thiserror = { workspace = true } + + +[dev-dependencies] +mars-osmosis = { workspace = true } +mars-testing = { workspace = true } +osmosis-std = { workspace = true } diff --git a/contracts/rewards-collector/osmosis/src/lib.rs b/contracts/rewards-collector/osmosis/src/lib.rs new file mode 100644 index 000000000..c22b450d8 --- /dev/null +++ b/contracts/rewards-collector/osmosis/src/lib.rs @@ -0,0 +1,38 @@ +#[cfg(not(feature = "library"))] +pub mod entry { + use cosmwasm_std::{ + entry_point, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult, + }; + use mars_red_bank_types::rewards_collector::{ExecuteMsg, InstantiateMsg, QueryMsg}; + use mars_rewards_collector_base::{contract::Collector, ContractResult}; + + pub type OsmosisCollector<'a> = Collector<'a, Empty, Empty>; + + #[entry_point] + pub fn instantiate( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: InstantiateMsg, + ) -> ContractResult { + let collector = OsmosisCollector::default(); + collector.instantiate(deps, env, info, msg) + } + + #[entry_point] + pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, + ) -> ContractResult { + let collector = OsmosisCollector::default(); + collector.execute(deps, env, info, msg) + } + + #[entry_point] + pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { + let collector = OsmosisCollector::default(); + collector.query(deps, env, msg) + } +} diff --git a/contracts/rewards-collector/tests/helpers.rs b/contracts/rewards-collector/osmosis/tests/helpers.rs similarity index 98% rename from contracts/rewards-collector/tests/helpers.rs rename to contracts/rewards-collector/osmosis/tests/helpers.rs index a0eabb768..a7872d802 100644 --- a/contracts/rewards-collector/tests/helpers.rs +++ b/contracts/rewards-collector/osmosis/tests/helpers.rs @@ -7,7 +7,7 @@ use cosmwasm_std::{ }; use mars_osmosis::helpers::{Pool, QueryPoolResponse}; use mars_red_bank_types::rewards_collector::{Config, InstantiateMsg, QueryMsg}; -use mars_rewards_collector::contract::entry; +use mars_rewards_collector_osmosis::entry; use mars_testing::{mock_info, MarsMockQuerier}; use osmosis_std::types::osmosis::gamm::v1beta1::PoolAsset; @@ -21,6 +21,7 @@ pub fn mock_instantiate_msg() -> InstantiateMsg { channel_id: "channel-69".to_string(), timeout_seconds: 300, slippage_tolerance: Decimal::percent(3), + neutron_ibc_config: None, } } diff --git a/contracts/rewards-collector/tests/test_admin.rs b/contracts/rewards-collector/osmosis/tests/test_admin.rs similarity index 97% rename from contracts/rewards-collector/tests/test_admin.rs rename to contracts/rewards-collector/osmosis/tests/test_admin.rs index bc193fffc..e25cd06c8 100644 --- a/contracts/rewards-collector/tests/test_admin.rs +++ b/contracts/rewards-collector/osmosis/tests/test_admin.rs @@ -1,10 +1,8 @@ use cosmwasm_std::{testing::mock_env, Decimal}; use mars_owner::OwnerError::NotOwner; use mars_red_bank_types::rewards_collector::{ConfigResponse, ExecuteMsg, QueryMsg, UpdateConfig}; -use mars_rewards_collector::{ - contract::entry::{execute, instantiate}, - ContractError, -}; +use mars_rewards_collector_base::ContractError; +use mars_rewards_collector_osmosis::entry::{execute, instantiate}; use mars_testing::mock_info; use mars_utils::error::ValidationError; diff --git a/contracts/rewards-collector/tests/test_distribute_rewards.rs b/contracts/rewards-collector/osmosis/tests/test_distribute_rewards.rs similarity index 95% rename from contracts/rewards-collector/tests/test_distribute_rewards.rs rename to contracts/rewards-collector/osmosis/tests/test_distribute_rewards.rs index 124208d86..0334c8ea3 100644 --- a/contracts/rewards-collector/tests/test_distribute_rewards.rs +++ b/contracts/rewards-collector/osmosis/tests/test_distribute_rewards.rs @@ -2,7 +2,8 @@ use cosmwasm_std::{ coin, testing::mock_env, CosmosMsg, IbcMsg, IbcTimeout, SubMsg, Timestamp, Uint128, }; use mars_red_bank_types::rewards_collector::ExecuteMsg; -use mars_rewards_collector::{contract::entry::execute, ContractError}; +use mars_rewards_collector_base::ContractError; +use mars_rewards_collector_osmosis::entry::execute; use mars_testing::{mock_env as mock_env_at_height_and_time, mock_info, MockEnvParams}; mod helpers; diff --git a/contracts/rewards-collector/tests/test_swap.rs b/contracts/rewards-collector/osmosis/tests/test_swap.rs similarity index 98% rename from contracts/rewards-collector/tests/test_swap.rs rename to contracts/rewards-collector/osmosis/tests/test_swap.rs index f574466f7..331d67ab8 100644 --- a/contracts/rewards-collector/tests/test_swap.rs +++ b/contracts/rewards-collector/osmosis/tests/test_swap.rs @@ -5,7 +5,7 @@ use mars_red_bank_types::{ rewards_collector::{ConfigResponse, ExecuteMsg, QueryMsg}, swapper, }; -use mars_rewards_collector::contract::entry::execute; +use mars_rewards_collector_osmosis::entry::execute; use mars_testing::mock_info; use osmosis_std::types::osmosis::twap::v1beta1::ArithmeticTwapToNowResponse; diff --git a/contracts/rewards-collector/tests/test_update_owner.rs b/contracts/rewards-collector/osmosis/tests/test_update_owner.rs similarity index 95% rename from contracts/rewards-collector/tests/test_update_owner.rs rename to contracts/rewards-collector/osmosis/tests/test_update_owner.rs index 099ac9926..7b41394c5 100644 --- a/contracts/rewards-collector/tests/test_update_owner.rs +++ b/contracts/rewards-collector/osmosis/tests/test_update_owner.rs @@ -1,7 +1,8 @@ use cosmwasm_std::testing::{mock_env, mock_info}; use mars_owner::{OwnerError::NotOwner, OwnerUpdate}; use mars_red_bank_types::rewards_collector::{ConfigResponse, ExecuteMsg, QueryMsg}; -use mars_rewards_collector::{contract::entry::execute, ContractError}; +use mars_rewards_collector_base::ContractError; +use mars_rewards_collector_osmosis::entry::execute; use crate::helpers::{query, setup_test}; diff --git a/contracts/rewards-collector/tests/test_withdraw.rs b/contracts/rewards-collector/osmosis/tests/test_withdraw.rs similarity index 95% rename from contracts/rewards-collector/tests/test_withdraw.rs rename to contracts/rewards-collector/osmosis/tests/test_withdraw.rs index 88ab1661e..788c71444 100644 --- a/contracts/rewards-collector/tests/test_withdraw.rs +++ b/contracts/rewards-collector/osmosis/tests/test_withdraw.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{testing::mock_env, to_binary, CosmosMsg, SubMsg, Uint128, WasmMsg}; use mars_red_bank_types::rewards_collector::ExecuteMsg; -use mars_rewards_collector::contract::entry::execute; +use mars_rewards_collector_osmosis::entry::execute; use mars_testing::mock_info; mod helpers; diff --git a/contracts/rewards-collector/src/traits.rs b/contracts/rewards-collector/src/traits.rs deleted file mode 100644 index dfdc8cfc6..000000000 --- a/contracts/rewards-collector/src/traits.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::fmt::{Debug, Display}; - -use cosmwasm_std::{CosmosMsg, CustomMsg, CustomQuery, Decimal, Env, QuerierWrapper, Uint128}; -use schemars::JsonSchema; -use serde::{de::DeserializeOwned, Serialize}; - -use crate::ContractResult; - -pub trait Route: - Serialize + DeserializeOwned + Clone + Debug + Display + PartialEq + JsonSchema -where - M: CustomMsg, - Q: CustomQuery, -{ - /// Determine whether the route is valid, given a pair of input and output denoms - fn validate( - &self, - querier: &QuerierWrapper, - denom_in: &str, - denom_out: &str, - ) -> ContractResult<()>; - - /// Build a message for executing the trade, given an input denom and amount - fn build_swap_msg( - &self, - env: &Env, - querier: &QuerierWrapper, - denom_in: &str, - amount: Uint128, - slippage_tolerance: Decimal, - ) -> ContractResult>; -} diff --git a/integration-tests/Cargo.toml b/integration-tests/Cargo.toml index 12b0316ed..323deee13 100755 --- a/integration-tests/Cargo.toml +++ b/integration-tests/Cargo.toml @@ -32,7 +32,7 @@ mars-oracle-base = { workspace = true } mars-osmosis = { workspace = true } mars-red-bank = { workspace = true } mars-red-bank-types = { workspace = true } -mars-rewards-collector = { workspace = true } +mars-rewards-collector-osmosis = { workspace = true } mars-testing = { workspace = true } mars-utils = { workspace = true } osmosis-std = { workspace = true } diff --git a/integration-tests/tests/test_oracles.rs b/integration-tests/tests/test_oracles.rs index 58cda0106..cfe1e2f84 100644 --- a/integration-tests/tests/test_oracles.rs +++ b/integration-tests/tests/test_oracles.rs @@ -34,7 +34,7 @@ mod helpers; const OSMOSIS_ORACLE_CONTRACT_NAME: &str = "mars-oracle-osmosis"; const OSMOSIS_RED_BANK_CONTRACT_NAME: &str = "mars-red-bank"; const OSMOSIS_ADDR_PROVIDER_CONTRACT_NAME: &str = "mars-address-provider"; -const OSMOSIS_REWARDS_CONTRACT_NAME: &str = "mars-rewards-collector"; +const OSMOSIS_REWARDS_CONTRACT_NAME: &str = "mars-rewards-collector-osmosis"; const OSMOSIS_INCENTIVES_CONTRACT_NAME: &str = "mars-incentives"; #[test] @@ -1077,6 +1077,7 @@ fn setup_redbank(wasm: &Wasm, signer: &SigningAccount) -> (Strin channel_id: "channel-1".to_string(), timeout_seconds: 60, slippage_tolerance: Decimal::new(Uint128::from(1u128)), + neutron_ibc_config: None, }, ); diff --git a/integration-tests/tests/test_rewards_collector.rs b/integration-tests/tests/test_rewards_collector.rs index 16b4972f2..cdaa615d2 100644 --- a/integration-tests/tests/test_rewards_collector.rs +++ b/integration-tests/tests/test_rewards_collector.rs @@ -20,7 +20,7 @@ mod cosmos_bank; mod helpers; const OSMOSIS_ADDR_PROVIDER_CONTRACT_NAME: &str = "mars-address-provider"; -const OSMOSIS_REWARDS_CONTRACT_NAME: &str = "mars-rewards-collector"; +const OSMOSIS_REWARDS_CONTRACT_NAME: &str = "mars-rewards-collector-osmosis"; const OSMOSIS_SWAPPER_CONTRACT_NAME: &str = "mars-swapper-osmosis"; #[test] @@ -67,6 +67,7 @@ fn swapping_rewards() { channel_id: "channel-1".to_string(), timeout_seconds: 60, slippage_tolerance: Decimal::percent(1), + neutron_ibc_config: None, }, ); @@ -325,6 +326,7 @@ fn distribute_rewards_if_ibc_channel_invalid() { channel_id: "".to_string(), timeout_seconds: 60, slippage_tolerance: Decimal::percent(1), + neutron_ibc_config: None, }, ); @@ -365,6 +367,7 @@ fn distribute_rewards_if_ibc_channel_invalid() { channel_id: Some("channel-1".to_string()), timeout_seconds: None, slippage_tolerance: None, + neutron_ibc_config: None, }, }, &[], diff --git a/packages/testing/Cargo.toml b/packages/testing/Cargo.toml index c113d3e4b..e6d6cc18a 100644 --- a/packages/testing/Cargo.toml +++ b/packages/testing/Cargo.toml @@ -34,7 +34,7 @@ mars-osmosis = { workspace = true } mars-owner = { workspace = true } mars-red-bank = { workspace = true } mars-red-bank-types = { workspace = true } -mars-rewards-collector = { workspace = true } +mars-rewards-collector-osmosis = { workspace = true } mars-swapper-astroport = { workspace = true } prost = { workspace = true } pyth-sdk-cw = { workspace = true } diff --git a/packages/testing/src/integration/mock_contracts.rs b/packages/testing/src/integration/mock_contracts.rs index 91f537303..5a3bc7b03 100644 --- a/packages/testing/src/integration/mock_contracts.rs +++ b/packages/testing/src/integration/mock_contracts.rs @@ -43,9 +43,9 @@ pub fn mock_red_bank_contract() -> Box> { pub fn mock_rewards_collector_osmosis_contract() -> Box> { let contract = ContractWrapper::new( - mars_rewards_collector::contract::entry::execute, - mars_rewards_collector::contract::entry::instantiate, - mars_rewards_collector::contract::entry::query, + mars_rewards_collector_osmosis::entry::execute, + mars_rewards_collector_osmosis::entry::instantiate, + mars_rewards_collector_osmosis::entry::query, ); Box::new(contract) } diff --git a/packages/testing/src/integration/mock_env.rs b/packages/testing/src/integration/mock_env.rs index 00696eab6..d4bf7cba5 100644 --- a/packages/testing/src/integration/mock_env.rs +++ b/packages/testing/src/integration/mock_env.rs @@ -672,6 +672,7 @@ impl MockEnvBuilder { channel_id: "0".to_string(), timeout_seconds: 900, slippage_tolerance: self.slippage_tolerance, + neutron_ibc_config: None, }, &[], "rewards-collector", diff --git a/packages/types/src/rewards_collector.rs b/packages/types/src/rewards_collector.rs index d63387f8a..ee11c8f58 100644 --- a/packages/types/src/rewards_collector.rs +++ b/packages/types/src/rewards_collector.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{Addr, Api, Decimal, StdResult, Uint128}; +use cosmwasm_std::{Addr, Api, Coin, Decimal, StdResult, Uint128}; use mars_owner::OwnerUpdate; use mars_utils::{ error::ValidationError, @@ -26,6 +26,8 @@ pub struct InstantiateMsg { pub timeout_seconds: u64, /// Maximum percentage of price movement (minimum amount you accept to receive during swap) pub slippage_tolerance: Decimal, + /// Neutron Ibc config + pub neutron_ibc_config: Option, } #[cw_serde] @@ -44,6 +46,15 @@ pub struct Config { pub timeout_seconds: u64, /// Maximum percentage of price movement (minimum amount you accept to receive during swap) pub slippage_tolerance: Decimal, + /// Neutron IBC config + pub neutron_ibc_config: Option, +} + +#[cw_serde] +pub struct NeutronIbcConfig { + pub source_port: String, + pub acc_fee: Vec, + pub timeout_fee: Vec, } impl Config { @@ -77,6 +88,7 @@ impl Config { channel_id: msg.channel_id, timeout_seconds: msg.timeout_seconds, slippage_tolerance: msg.slippage_tolerance, + neutron_ibc_config: msg.neutron_ibc_config, }) } } @@ -98,6 +110,8 @@ pub struct UpdateConfig { pub timeout_seconds: Option, /// Maximum percentage of price movement (minimum amount you accept to receive during swap) pub slippage_tolerance: Option, + /// Neutron Ibc config + pub neutron_ibc_config: Option, } #[cw_serde] diff --git a/schema.Makefile.toml b/schema.Makefile.toml index 5b4d32833..e52c006e8 100644 --- a/schema.Makefile.toml +++ b/schema.Makefile.toml @@ -14,7 +14,7 @@ fn main() -> std::io::Result<()> { "mars-address-provider", "mars-incentives", "mars-red-bank", - "mars-rewards-collector", + "mars-rewards-collector-base", "mars-swapper-osmosis", "mars-swapper-astroport", "mars-oracle-osmosis", diff --git a/schemas/mars-rewards-collector/mars-rewards-collector.json b/schemas/mars-rewards-collector-base/mars-rewards-collector-base.json similarity index 83% rename from schemas/mars-rewards-collector/mars-rewards-collector.json rename to schemas/mars-rewards-collector-base/mars-rewards-collector-base.json index e29b465b3..8d5f29cf4 100644 --- a/schemas/mars-rewards-collector/mars-rewards-collector.json +++ b/schemas/mars-rewards-collector-base/mars-rewards-collector-base.json @@ -1,5 +1,5 @@ { - "contract_name": "mars-rewards-collector", + "contract_name": "mars-rewards-collector-base", "contract_version": "1.1.0", "idl_version": "1.0.0", "instantiate": { @@ -29,6 +29,17 @@ "description": "The asset to which the fee collector share is converted", "type": "string" }, + "neutron_ibc_config": { + "description": "Neutron Ibc config", + "anyOf": [ + { + "$ref": "#/definitions/NeutronIbcConfig" + }, + { + "type": "null" + } + ] + }, "owner": { "description": "The contract's owner", "type": "string" @@ -62,9 +73,54 @@ }, "additionalProperties": false, "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, "Decimal": { "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", "type": "string" + }, + "NeutronIbcConfig": { + "type": "object", + "required": [ + "acc_fee", + "source_port", + "timeout_fee" + ], + "properties": { + "acc_fee": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "source_port": { + "type": "string" + }, + "timeout_fee": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" } } }, @@ -244,10 +300,51 @@ } ], "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, "Decimal": { "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", "type": "string" }, + "NeutronIbcConfig": { + "type": "object", + "required": [ + "acc_fee", + "source_port", + "timeout_fee" + ], + "properties": { + "acc_fee": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + }, + "source_port": { + "type": "string" + }, + "timeout_fee": { + "type": "array", + "items": { + "$ref": "#/definitions/Coin" + } + } + }, + "additionalProperties": false + }, "OwnerUpdate": { "oneOf": [ { @@ -352,6 +449,17 @@ "null" ] }, + "neutron_ibc_config": { + "description": "Neutron Ibc config", + "anyOf": [ + { + "$ref": "#/definitions/NeutronIbcConfig" + }, + { + "type": "null" + } + ] + }, "safety_fund_denom": { "description": "The asset to which the safety fund share is converted", "type": [ diff --git a/scripts/deploy/base/deployer.ts b/scripts/deploy/base/deployer.ts index 2cdbf87da..f37772595 100644 --- a/scripts/deploy/base/deployer.ts +++ b/scripts/deploy/base/deployer.ts @@ -17,7 +17,7 @@ import { } from '../../types/generated/mars-red-bank/MarsRedBank.types' import { InstantiateMsg as AddressProviderInstantiateMsg } from '../../types/generated/mars-address-provider/MarsAddressProvider.types' import { InstantiateMsg as IncentivesInstantiateMsg } from '../../types/generated/mars-incentives/MarsIncentives.types' -import { InstantiateMsg as RewardsInstantiateMsg } from '../../types/generated/mars-rewards-collector/MarsRewardsCollector.types' +import { InstantiateMsg as RewardsInstantiateMsg } from '../../types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.types' import { WasmOracleCustomInitParams, InstantiateMsg as WasmOracleInstantiateMsg, diff --git a/scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.client.ts b/scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.client.ts similarity index 91% rename from scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.client.ts rename to scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.client.ts index 7d8b9fb44..44808d0c6 100644 --- a/scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.client.ts +++ b/scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.client.ts @@ -6,22 +6,26 @@ */ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from '@cosmjs/cosmwasm-stargate' -import { Coin, StdFee } from '@cosmjs/amino' +import { StdFee } from '@cosmjs/amino' import { + Uint128, Decimal, InstantiateMsg, + NeutronIbcConfig, + Coin, ExecuteMsg, OwnerUpdate, - Uint128, UpdateConfig, QueryMsg, ConfigResponse, -} from './MarsRewardsCollector.types' -export interface MarsRewardsCollectorReadOnlyInterface { +} from './MarsRewardsCollectorBase.types' +export interface MarsRewardsCollectorBaseReadOnlyInterface { contractAddress: string config: () => Promise } -export class MarsRewardsCollectorQueryClient implements MarsRewardsCollectorReadOnlyInterface { +export class MarsRewardsCollectorBaseQueryClient + implements MarsRewardsCollectorBaseReadOnlyInterface +{ client: CosmWasmClient contractAddress: string @@ -37,7 +41,8 @@ export class MarsRewardsCollectorQueryClient implements MarsRewardsCollectorRead }) } } -export interface MarsRewardsCollectorInterface extends MarsRewardsCollectorReadOnlyInterface { +export interface MarsRewardsCollectorBaseInterface + extends MarsRewardsCollectorBaseReadOnlyInterface { contractAddress: string sender: string updateOwner: ( @@ -107,9 +112,9 @@ export interface MarsRewardsCollectorInterface extends MarsRewardsCollectorReadO _funds?: Coin[], ) => Promise } -export class MarsRewardsCollectorClient - extends MarsRewardsCollectorQueryClient - implements MarsRewardsCollectorInterface +export class MarsRewardsCollectorBaseClient + extends MarsRewardsCollectorBaseQueryClient + implements MarsRewardsCollectorBaseInterface { client: SigningCosmWasmClient sender: string diff --git a/scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.react-query.ts b/scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.react-query.ts similarity index 55% rename from scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.react-query.ts rename to scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.react-query.ts index 6e749847a..5db72cd7f 100644 --- a/scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.react-query.ts +++ b/scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.react-query.ts @@ -7,36 +7,38 @@ import { UseQueryOptions, useQuery, useMutation, UseMutationOptions } from '@tanstack/react-query' import { ExecuteResult } from '@cosmjs/cosmwasm-stargate' -import { StdFee, Coin } from '@cosmjs/amino' +import { StdFee } from '@cosmjs/amino' import { + Uint128, Decimal, InstantiateMsg, + NeutronIbcConfig, + Coin, ExecuteMsg, OwnerUpdate, - Uint128, UpdateConfig, QueryMsg, ConfigResponse, -} from './MarsRewardsCollector.types' +} from './MarsRewardsCollectorBase.types' import { - MarsRewardsCollectorQueryClient, - MarsRewardsCollectorClient, -} from './MarsRewardsCollector.client' -export const marsRewardsCollectorQueryKeys = { + MarsRewardsCollectorBaseQueryClient, + MarsRewardsCollectorBaseClient, +} from './MarsRewardsCollectorBase.client' +export const marsRewardsCollectorBaseQueryKeys = { contract: [ { - contract: 'marsRewardsCollector', + contract: 'marsRewardsCollectorBase', }, ] as const, address: (contractAddress: string | undefined) => - [{ ...marsRewardsCollectorQueryKeys.contract[0], address: contractAddress }] as const, + [{ ...marsRewardsCollectorBaseQueryKeys.contract[0], address: contractAddress }] as const, config: (contractAddress: string | undefined, args?: Record) => [ - { ...marsRewardsCollectorQueryKeys.address(contractAddress)[0], method: 'config', args }, + { ...marsRewardsCollectorBaseQueryKeys.address(contractAddress)[0], method: 'config', args }, ] as const, } -export interface MarsRewardsCollectorReactQuery { - client: MarsRewardsCollectorQueryClient | undefined +export interface MarsRewardsCollectorBaseReactQuery { + client: MarsRewardsCollectorBaseQueryClient | undefined options?: Omit< UseQueryOptions, "'queryKey' | 'queryFn' | 'initialData'" @@ -44,20 +46,20 @@ export interface MarsRewardsCollectorReactQuery { initialData?: undefined } } -export interface MarsRewardsCollectorConfigQuery - extends MarsRewardsCollectorReactQuery {} -export function useMarsRewardsCollectorConfigQuery({ +export interface MarsRewardsCollectorBaseConfigQuery + extends MarsRewardsCollectorBaseReactQuery {} +export function useMarsRewardsCollectorBaseConfigQuery({ client, options, -}: MarsRewardsCollectorConfigQuery) { +}: MarsRewardsCollectorBaseConfigQuery) { return useQuery( - marsRewardsCollectorQueryKeys.config(client?.contractAddress), + marsRewardsCollectorBaseQueryKeys.config(client?.contractAddress), () => (client ? client.config() : Promise.reject(new Error('Invalid client'))), { ...options, enabled: !!client && (options?.enabled != undefined ? options.enabled : true) }, ) } -export interface MarsRewardsCollectorClaimIncentiveRewardsMutation { - client: MarsRewardsCollectorClient +export interface MarsRewardsCollectorBaseClaimIncentiveRewardsMutation { + client: MarsRewardsCollectorBaseClient msg: { limit?: number startAfterCollateralDenom?: string @@ -69,20 +71,20 @@ export interface MarsRewardsCollectorClaimIncentiveRewardsMutation { funds?: Coin[] } } -export function useMarsRewardsCollectorClaimIncentiveRewardsMutation( +export function useMarsRewardsCollectorBaseClaimIncentiveRewardsMutation( options?: Omit< - UseMutationOptions, + UseMutationOptions, 'mutationFn' >, ) { - return useMutation( + return useMutation( ({ client, msg, args: { fee, memo, funds } = {} }) => client.claimIncentiveRewards(msg, fee, memo, funds), options, ) } -export interface MarsRewardsCollectorSwapAssetMutation { - client: MarsRewardsCollectorClient +export interface MarsRewardsCollectorBaseSwapAssetMutation { + client: MarsRewardsCollectorBaseClient msg: { amount?: Uint128 denom: string @@ -93,19 +95,19 @@ export interface MarsRewardsCollectorSwapAssetMutation { funds?: Coin[] } } -export function useMarsRewardsCollectorSwapAssetMutation( +export function useMarsRewardsCollectorBaseSwapAssetMutation( options?: Omit< - UseMutationOptions, + UseMutationOptions, 'mutationFn' >, ) { - return useMutation( + return useMutation( ({ client, msg, args: { fee, memo, funds } = {} }) => client.swapAsset(msg, fee, memo, funds), options, ) } -export interface MarsRewardsCollectorDistributeRewardsMutation { - client: MarsRewardsCollectorClient +export interface MarsRewardsCollectorBaseDistributeRewardsMutation { + client: MarsRewardsCollectorBaseClient msg: { amount?: Uint128 denom: string @@ -116,20 +118,20 @@ export interface MarsRewardsCollectorDistributeRewardsMutation { funds?: Coin[] } } -export function useMarsRewardsCollectorDistributeRewardsMutation( +export function useMarsRewardsCollectorBaseDistributeRewardsMutation( options?: Omit< - UseMutationOptions, + UseMutationOptions, 'mutationFn' >, ) { - return useMutation( + return useMutation( ({ client, msg, args: { fee, memo, funds } = {} }) => client.distributeRewards(msg, fee, memo, funds), options, ) } -export interface MarsRewardsCollectorWithdrawFromRedBankMutation { - client: MarsRewardsCollectorClient +export interface MarsRewardsCollectorBaseWithdrawFromRedBankMutation { + client: MarsRewardsCollectorBaseClient msg: { amount?: Uint128 denom: string @@ -140,20 +142,20 @@ export interface MarsRewardsCollectorWithdrawFromRedBankMutation { funds?: Coin[] } } -export function useMarsRewardsCollectorWithdrawFromRedBankMutation( +export function useMarsRewardsCollectorBaseWithdrawFromRedBankMutation( options?: Omit< - UseMutationOptions, + UseMutationOptions, 'mutationFn' >, ) { - return useMutation( + return useMutation( ({ client, msg, args: { fee, memo, funds } = {} }) => client.withdrawFromRedBank(msg, fee, memo, funds), options, ) } -export interface MarsRewardsCollectorUpdateConfigMutation { - client: MarsRewardsCollectorClient +export interface MarsRewardsCollectorBaseUpdateConfigMutation { + client: MarsRewardsCollectorBaseClient msg: { newCfg: UpdateConfig } @@ -163,20 +165,20 @@ export interface MarsRewardsCollectorUpdateConfigMutation { funds?: Coin[] } } -export function useMarsRewardsCollectorUpdateConfigMutation( +export function useMarsRewardsCollectorBaseUpdateConfigMutation( options?: Omit< - UseMutationOptions, + UseMutationOptions, 'mutationFn' >, ) { - return useMutation( + return useMutation( ({ client, msg, args: { fee, memo, funds } = {} }) => client.updateConfig(msg, fee, memo, funds), options, ) } -export interface MarsRewardsCollectorUpdateOwnerMutation { - client: MarsRewardsCollectorClient +export interface MarsRewardsCollectorBaseUpdateOwnerMutation { + client: MarsRewardsCollectorBaseClient msg: OwnerUpdate args?: { fee?: number | StdFee | 'auto' @@ -184,13 +186,13 @@ export interface MarsRewardsCollectorUpdateOwnerMutation { funds?: Coin[] } } -export function useMarsRewardsCollectorUpdateOwnerMutation( +export function useMarsRewardsCollectorBaseUpdateOwnerMutation( options?: Omit< - UseMutationOptions, + UseMutationOptions, 'mutationFn' >, ) { - return useMutation( + return useMutation( ({ client, msg, args: { fee, memo, funds } = {} }) => client.updateOwner(msg, fee, memo, funds), options, ) diff --git a/scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.types.ts b/scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.types.ts similarity index 88% rename from scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.types.ts rename to scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.types.ts index d5bc432c2..a1148e582 100644 --- a/scripts/types/generated/mars-rewards-collector/MarsRewardsCollector.types.ts +++ b/scripts/types/generated/mars-rewards-collector-base/MarsRewardsCollectorBase.types.ts @@ -5,17 +5,29 @@ * and run the @cosmwasm/ts-codegen generate command to regenerate this file. */ +export type Uint128 = string export type Decimal = string export interface InstantiateMsg { address_provider: string channel_id: string fee_collector_denom: string + neutron_ibc_config?: NeutronIbcConfig | null owner: string safety_fund_denom: string safety_tax_rate: Decimal slippage_tolerance: Decimal timeout_seconds: number } +export interface NeutronIbcConfig { + acc_fee: Coin[] + source_port: string + timeout_fee: Coin[] +} +export interface Coin { + amount: Uint128 + denom: string + [k: string]: unknown +} export type ExecuteMsg = | { update_owner: OwnerUpdate @@ -65,11 +77,11 @@ export type OwnerUpdate = } } | 'clear_emergency_owner' -export type Uint128 = string export interface UpdateConfig { address_provider?: string | null channel_id?: string | null fee_collector_denom?: string | null + neutron_ibc_config?: NeutronIbcConfig | null safety_fund_denom?: string | null safety_tax_rate?: Decimal | null slippage_tolerance?: Decimal | null diff --git a/scripts/types/generated/mars-rewards-collector/bundle.ts b/scripts/types/generated/mars-rewards-collector-base/bundle.ts similarity index 53% rename from scripts/types/generated/mars-rewards-collector/bundle.ts rename to scripts/types/generated/mars-rewards-collector-base/bundle.ts index f816bcd1c..7b5021ad3 100644 --- a/scripts/types/generated/mars-rewards-collector/bundle.ts +++ b/scripts/types/generated/mars-rewards-collector-base/bundle.ts @@ -5,9 +5,9 @@ * and run the @cosmwasm/ts-codegen generate command to regenerate this file. */ -import * as _15 from './MarsRewardsCollector.types' -import * as _16 from './MarsRewardsCollector.client' -import * as _17 from './MarsRewardsCollector.react-query' +import * as _15 from './MarsRewardsCollectorBase.types' +import * as _16 from './MarsRewardsCollectorBase.client' +import * as _17 from './MarsRewardsCollectorBase.react-query' export namespace contracts { - export const MarsRewardsCollector = { ..._15, ..._16, ..._17 } + export const MarsRewardsCollectorBase = { ..._15, ..._16, ..._17 } } diff --git a/scripts/types/msg.ts b/scripts/types/msg.ts index 7a1a207ec..995958884 100644 --- a/scripts/types/msg.ts +++ b/scripts/types/msg.ts @@ -2,7 +2,7 @@ import { InstantiateMsg as AstroportSwapperInstantiateMsg } from './generated/ma import { InstantiateMsg as RedBankInstantiateMsg } from './generated/mars-red-bank/MarsRedBank.types' import { InstantiateMsg as AddressProviderInstantiateMsg } from './generated/mars-address-provider/MarsAddressProvider.types' import { InstantiateMsg as IncentivesInstantiateMsg } from './generated/mars-incentives/MarsIncentives.types' -import { InstantiateMsg as RewardsInstantiateMsg } from './generated/mars-rewards-collector/MarsRewardsCollector.types' +import { InstantiateMsg as RewardsInstantiateMsg } from './generated/mars-rewards-collector-base/MarsRewardsCollectorBase.types' import { InstantiateMsg as WasmOracleInstantiateMsg } from './generated/mars-oracle-wasm/MarsOracleWasm.types' import { InstantiateMsg as OsmosisSwapperInstantiateMsg } from './generated/mars-swapper-osmosis/MarsSwapperOsmosis.types' import { InstantiateMsg as OsmosisOracleInstantiateMsg } from './generated/mars-oracle-osmosis/MarsOracleOsmosis.types'