From 70253e214fe37db22d1494ae20e465cb9615228e Mon Sep 17 00:00:00 2001 From: Carlos Date: Sun, 27 Feb 2022 14:32:17 +0900 Subject: [PATCH] Auction discount fix (#92) * lower auction discount for assets with low minCR * change test name * fix clippy * remove previous mint migrate msg * update mint version and changelog --- CHANGELOG.md | 5 +- contracts/mirror_gov/src/testing/tests.rs | 19 +-- contracts/mirror_mint/Cargo.toml | 2 +- contracts/mirror_mint/examples/schema.rs | 3 +- .../mirror_mint/schema/cw20_hook_msg.json | 4 +- contracts/mirror_mint/schema/execute_msg.json | 4 +- contracts/mirror_mint/schema/migrate_msg.json | 25 ---- .../mirror_mint/schema/position_response.json | 2 +- .../schema/positions_response.json | 2 +- contracts/mirror_mint/schema/query_msg.json | 2 +- contracts/mirror_mint/src/asserts.rs | 16 +- contracts/mirror_mint/src/contract.rs | 8 +- contracts/mirror_mint/src/math.rs | 8 + contracts/mirror_mint/src/positions.rs | 24 ++- .../mirror_mint/src/testing/contract_test.rs | 4 +- .../mirror_mint/src/testing/mock_querier.rs | 5 +- .../mirror_mint/src/testing/positions_test.rs | 138 ++++++++++++++++++ contracts/mirror_staking/src/rewards.rs | 75 +++++----- packages/mirror_protocol/src/mint.rs | 8 - 19 files changed, 231 insertions(+), 123 deletions(-) delete mode 100644 contracts/mirror_mint/schema/migrate_msg.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b0b4169..5282c4e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,3 @@ -# 2.1.3 +# 2.1.4 -* Migration for collateral oracle and collector to support LunaX as collateral #88 -* Fixed max spread issue with Astroport pairs on Collector \ No newline at end of file +* Auction discount fix for mint contract #92 \ No newline at end of file diff --git a/contracts/mirror_gov/src/testing/tests.rs b/contracts/mirror_gov/src/testing/tests.rs index c42cc89b..4806f8ac 100644 --- a/contracts/mirror_gov/src/testing/tests.rs +++ b/contracts/mirror_gov/src/testing/tests.rs @@ -2708,12 +2708,7 @@ fn distribute_voting_rewards() { // voting info has been deleted assert!(poll_voter_read(&deps.storage, 1u64) - .load( - deps.api - .addr_canonicalize(&TEST_VOTER.to_string()) - .unwrap() - .as_slice() - ) + .load(deps.api.addr_canonicalize(TEST_VOTER).unwrap().as_slice()) .is_err()) } @@ -2843,12 +2838,7 @@ fn stake_voting_rewards() { // voting info has been deleted assert!(poll_voter_read(&deps.storage, 1u64) - .load( - deps.api - .addr_canonicalize(&TEST_VOTER.to_string()) - .unwrap() - .as_slice() - ) + .load(deps.api.addr_canonicalize(TEST_VOTER).unwrap().as_slice()) .is_err()); let res = query( @@ -4502,10 +4492,7 @@ fn happy_days_end_poll_with_controlled_quorum() { let actual_staked_weight = load_token_balance( &deps.as_ref().querier, VOTING_TOKEN.to_string(), - &deps - .api - .addr_canonicalize(&MOCK_CONTRACT_ADDR.to_string()) - .unwrap(), + &deps.api.addr_canonicalize(MOCK_CONTRACT_ADDR).unwrap(), ) .unwrap() .checked_sub(Uint128::new(DEFAULT_PROPOSAL_DEPOSIT)) diff --git a/contracts/mirror_mint/Cargo.toml b/contracts/mirror_mint/Cargo.toml index 03f9702b..98aeab99 100644 --- a/contracts/mirror_mint/Cargo.toml +++ b/contracts/mirror_mint/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mirror-mint" -version = "2.1.1" +version = "2.1.4" authors = ["Terraform Labs, PTE."] edition = "2018" description = "A Mint contract for Mirror Protocol - allows you to register and mint asset token" diff --git a/contracts/mirror_mint/examples/schema.rs b/contracts/mirror_mint/examples/schema.rs index eefa8f99..22035123 100644 --- a/contracts/mirror_mint/examples/schema.rs +++ b/contracts/mirror_mint/examples/schema.rs @@ -4,7 +4,7 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; use mirror_protocol::mint::{ - AssetConfigResponse, ConfigResponse, Cw20HookMsg, ExecuteMsg, InstantiateMsg, MigrateMsg, + AssetConfigResponse, ConfigResponse, Cw20HookMsg, ExecuteMsg, InstantiateMsg, NextPositionIdxResponse, PositionResponse, PositionsResponse, QueryMsg, ShortParams, }; @@ -19,7 +19,6 @@ fn main() { export_schema(&schema_for!(ShortParams), &out_dir); export_schema(&schema_for!(Cw20HookMsg), &out_dir); export_schema(&schema_for!(QueryMsg), &out_dir); - export_schema(&schema_for!(MigrateMsg), &out_dir); export_schema(&schema_for!(ConfigResponse), &out_dir); export_schema(&schema_for!(NextPositionIdxResponse), &out_dir); export_schema(&schema_for!(AssetConfigResponse), &out_dir); diff --git a/contracts/mirror_mint/schema/cw20_hook_msg.json b/contracts/mirror_mint/schema/cw20_hook_msg.json index 53605468..45d5933a 100644 --- a/contracts/mirror_mint/schema/cw20_hook_msg.json +++ b/contracts/mirror_mint/schema/cw20_hook_msg.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Cw20HookMsg", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ @@ -103,7 +103,7 @@ "definitions": { "AssetInfo": { "description": "AssetInfo contract_addr is usually passed from the cw20 hook so we can trust the contract_addr is properly validated.", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ diff --git a/contracts/mirror_mint/schema/execute_msg.json b/contracts/mirror_mint/schema/execute_msg.json index 7e539eb8..278ba4d5 100644 --- a/contracts/mirror_mint/schema/execute_msg.json +++ b/contracts/mirror_mint/schema/execute_msg.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "ExecuteMsg", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ @@ -373,7 +373,7 @@ }, "AssetInfo": { "description": "AssetInfo contract_addr is usually passed from the cw20 hook so we can trust the contract_addr is properly validated.", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ diff --git a/contracts/mirror_mint/schema/migrate_msg.json b/contracts/mirror_mint/schema/migrate_msg.json deleted file mode 100644 index 87827c46..00000000 --- a/contracts/mirror_mint/schema/migrate_msg.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MigrateMsg", - "type": "object", - "required": [ - "collateral_oracle", - "lock", - "staking", - "terraswap_factory" - ], - "properties": { - "collateral_oracle": { - "type": "string" - }, - "lock": { - "type": "string" - }, - "staking": { - "type": "string" - }, - "terraswap_factory": { - "type": "string" - } - } -} diff --git a/contracts/mirror_mint/schema/position_response.json b/contracts/mirror_mint/schema/position_response.json index 2528835e..65a199b2 100644 --- a/contracts/mirror_mint/schema/position_response.json +++ b/contracts/mirror_mint/schema/position_response.json @@ -44,7 +44,7 @@ }, "AssetInfo": { "description": "AssetInfo contract_addr is usually passed from the cw20 hook so we can trust the contract_addr is properly validated.", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ diff --git a/contracts/mirror_mint/schema/positions_response.json b/contracts/mirror_mint/schema/positions_response.json index 052a971b..a1a668e9 100644 --- a/contracts/mirror_mint/schema/positions_response.json +++ b/contracts/mirror_mint/schema/positions_response.json @@ -31,7 +31,7 @@ }, "AssetInfo": { "description": "AssetInfo contract_addr is usually passed from the cw20 hook so we can trust the contract_addr is properly validated.", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ diff --git a/contracts/mirror_mint/schema/query_msg.json b/contracts/mirror_mint/schema/query_msg.json index b5cf2463..40fcfd53 100644 --- a/contracts/mirror_mint/schema/query_msg.json +++ b/contracts/mirror_mint/schema/query_msg.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "QueryMsg", - "anyOf": [ + "oneOf": [ { "type": "object", "required": [ diff --git a/contracts/mirror_mint/src/asserts.rs b/contracts/mirror_mint/src/asserts.rs index 9960be83..2a0b43ac 100644 --- a/contracts/mirror_mint/src/asserts.rs +++ b/contracts/mirror_mint/src/asserts.rs @@ -1,4 +1,9 @@ -use crate::state::{AssetConfig, Position}; +use std::str::FromStr; + +use crate::{ + contract::MIN_CR_ALLOWED, + state::{AssetConfig, Position}, +}; use cosmwasm_std::{Decimal, Deps, Env, StdError, StdResult}; use terraswap::asset::{Asset, AssetInfo}; @@ -57,10 +62,11 @@ pub fn assert_auction_discount(auction_discount: Decimal) -> StdResult<()> { } pub fn assert_min_collateral_ratio(min_collateral_ratio: Decimal) -> StdResult<()> { - if min_collateral_ratio < Decimal::one() { - Err(StdError::generic_err( - "min_collateral_ratio must be bigger than 1", - )) + if min_collateral_ratio < Decimal::from_str(MIN_CR_ALLOWED)? { + Err(StdError::generic_err(format!( + "min_collateral_ratio must be bigger or equal than {}", + MIN_CR_ALLOWED + ))) } else { Ok(()) } diff --git a/contracts/mirror_mint/src/contract.rs b/contracts/mirror_mint/src/contract.rs index 89921a94..279442bc 100644 --- a/contracts/mirror_mint/src/contract.rs +++ b/contracts/mirror_mint/src/contract.rs @@ -14,16 +14,18 @@ use crate::{ use cosmwasm_std::entry_point; use cosmwasm_std::{ attr, from_binary, to_binary, Addr, Binary, CanonicalAddr, CosmosMsg, Decimal, Deps, DepsMut, - Env, MessageInfo, Response, StdError, StdResult, Uint128, WasmMsg, + Empty, Env, MessageInfo, Response, StdError, StdResult, Uint128, WasmMsg, }; use cw20::Cw20ReceiveMsg; use mirror_protocol::collateral_oracle::{ExecuteMsg as CollateralOracleExecuteMsg, SourceType}; use mirror_protocol::mint::{ AssetConfigResponse, ConfigResponse, Cw20HookMsg, ExecuteMsg, IPOParams, InstantiateMsg, - MigrateMsg, QueryMsg, + QueryMsg, }; use terraswap::asset::{Asset, AssetInfo}; +pub const MIN_CR_ALLOWED: &str = "1.1"; + #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( deps: DepsMut, @@ -543,6 +545,6 @@ pub fn query_asset_config(deps: Deps, asset_token: String) -> StdResult StdResult { +pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> StdResult { Ok(Response::default()) } diff --git a/contracts/mirror_mint/src/math.rs b/contracts/mirror_mint/src/math.rs index e11d09ad..e1019abd 100644 --- a/contracts/mirror_mint/src/math.rs +++ b/contracts/mirror_mint/src/math.rs @@ -23,3 +23,11 @@ pub fn decimal_division(a: Decimal, b: Decimal) -> Decimal { pub fn decimal_multiplication(a: Decimal, b: Decimal) -> Decimal { Decimal::from_ratio(a * DECIMAL_FRACTIONAL * b, DECIMAL_FRACTIONAL) } + +pub fn decimal_min(a: Decimal, b: Decimal) -> Decimal { + if a < b { + a + } else { + b + } +} diff --git a/contracts/mirror_mint/src/positions.rs b/contracts/mirror_mint/src/positions.rs index 9564fac9..06c20b65 100644 --- a/contracts/mirror_mint/src/positions.rs +++ b/contracts/mirror_mint/src/positions.rs @@ -8,7 +8,9 @@ use crate::{ assert_asset, assert_burn_period, assert_collateral, assert_migrated_asset, assert_mint_period, assert_pre_ipo_collateral, assert_revoked_collateral, }, - math::{decimal_division, decimal_multiplication, decimal_subtraction, reverse_decimal}, + math::{ + decimal_division, decimal_min, decimal_multiplication, decimal_subtraction, reverse_decimal, + }, querier::{load_asset_price, load_collateral_info}, state::{ create_position, is_short_position, read_asset_config, read_config, read_position, @@ -798,10 +800,15 @@ pub fn auction( )); } + // auction discount is min(min_cr - 1, auction_discount) + let auction_discount: Decimal = decimal_min( + asset_config.auction_discount, + decimal_subtraction(asset_config.min_collateral_ratio, Decimal::one()), + ); // Compute discounted price let discounted_price: Decimal = decimal_division( collateral_price_in_asset, - decimal_subtraction(Decimal::one(), asset_config.auction_discount), + decimal_subtraction(Decimal::one(), auction_discount), ); // Convert asset value in discounted collateral unit @@ -820,12 +827,13 @@ pub fn auction( .unwrap() * reverse_decimal(discounted_price); - let refund_asset: Asset = Asset { - info: asset.info.clone(), - amount: refund_asset_amount, - }; - - messages.push(refund_asset.into_msg(&deps.querier, sender.clone())?); + if !refund_asset_amount.is_zero() { + let refund_asset: Asset = Asset { + info: asset.info.clone(), + amount: refund_asset_amount, + }; + messages.push(refund_asset.into_msg(&deps.querier, sender.clone())?); + } (position.collateral.amount, refund_asset_amount) } else { diff --git a/contracts/mirror_mint/src/testing/contract_test.rs b/contracts/mirror_mint/src/testing/contract_test.rs index c7d1c7e8..e68ff457 100644 --- a/contracts/mirror_mint/src/testing/contract_test.rs +++ b/contracts/mirror_mint/src/testing/contract_test.rs @@ -210,7 +210,7 @@ fn register_asset() { let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err(); match res { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "min_collateral_ratio must be bigger than 1") + assert_eq!(msg, "min_collateral_ratio must be bigger or equal than 1.1") } _ => panic!("DO NOT ENTER HERE"), } @@ -300,7 +300,7 @@ fn update_asset() { let res = execute(deps.as_mut(), mock_env(), info, msg).unwrap_err(); match res { StdError::GenericErr { msg, .. } => { - assert_eq!(msg, "min_collateral_ratio must be bigger than 1") + assert_eq!(msg, "min_collateral_ratio must be bigger or equal than 1.1") } _ => panic!("Must return unauthorized error"), } diff --git a/contracts/mirror_mint/src/testing/mock_querier.rs b/contracts/mirror_mint/src/testing/mock_querier.rs index 8328b599..4cdc1ba1 100644 --- a/contracts/mirror_mint/src/testing/mock_querier.rs +++ b/contracts/mirror_mint/src/testing/mock_querier.rs @@ -132,10 +132,7 @@ impl TerraswapPairQuerier { pub(crate) fn paris_to_map(pairs: &[(&String, &String, &String)]) -> HashMap { let mut pairs_map: HashMap = HashMap::new(); for (asset1, asset2, pair) in pairs.iter() { - pairs_map.insert( - (asset1.to_string() + &asset2.to_string()).clone(), - pair.to_string(), - ); + pairs_map.insert((asset1.to_string() + asset2).clone(), pair.to_string()); } pairs_map diff --git a/contracts/mirror_mint/src/testing/positions_test.rs b/contracts/mirror_mint/src/testing/positions_test.rs index 71f6ead3..b8b447d4 100644 --- a/contracts/mirror_mint/src/testing/positions_test.rs +++ b/contracts/mirror_mint/src/testing/positions_test.rs @@ -1723,3 +1723,141 @@ fn auction() { ] ); } + +#[test] +fn liquidate_with_low_discount_test() { + let mut deps = mock_dependencies(&[]); + deps.querier.with_tax( + Decimal::zero(), + &[(&"uusd".to_string(), &Uint128::from(1000000u128))], + ); + deps.querier.with_oracle_price(&[ + (&"uusd".to_string(), &Decimal::one()), + ( + &"asset0000".to_string(), + &Decimal::from_ratio(1000u128, 1000u128), + ), + ]); + + let base_denom = "uusd".to_string(); + + let msg = InstantiateMsg { + owner: "owner0000".to_string(), + oracle: "oracle0000".to_string(), + collector: "collector0000".to_string(), + collateral_oracle: "collateraloracle0000".to_string(), + staking: "staking0000".to_string(), + terraswap_factory: "terraswap_factory".to_string(), + lock: "lock0000".to_string(), + base_denom, + token_code_id: TOKEN_CODE_ID, + protocol_fee_rate: Decimal::percent(1), + }; + + let info = mock_info("addr0000", &[]); + let _res = instantiate(deps.as_mut(), mock_env(), info, msg).unwrap(); + + let msg = ExecuteMsg::RegisterAsset { + asset_token: "asset0000".to_string(), + auction_discount: Decimal::percent(20), + min_collateral_ratio: Decimal::percent(110), + ipo_params: None, + }; + + let info = mock_info("owner0000", &[]); + let _res = execute(deps.as_mut(), mock_env(), info, msg).unwrap(); + + // open uusd-asset0000 position + let msg = ExecuteMsg::OpenPosition { + collateral: Asset { + info: AssetInfo::NativeToken { + denom: "uusd".to_string(), + }, + amount: Uint128::from(1000u128), + }, + asset_info: AssetInfo::Token { + contract_addr: "asset0000".to_string(), + }, + collateral_ratio: Decimal::percent(110), + short_params: None, + }; + let env = mock_env_with_block_time(1000); + let info = mock_info( + "addr0000", + &[Coin { + denom: "uusd".to_string(), + amount: Uint128::from(1000u128), + }], + ); + let _res = execute(deps.as_mut(), env, info, msg).unwrap(); + + deps.querier.with_oracle_price(&[ + (&"uusd".to_string(), &Decimal::one()), + ( + &"asset0000".to_string(), + &Decimal::from_ratio(1010u128, 1000u128), + ), + ]); + + // auction success + let msg = ExecuteMsg::Receive(Cw20ReceiveMsg { + sender: "addr0001".to_string(), + amount: Uint128::from(909u128), + msg: to_binary(&Cw20HookMsg::Auction { + position_idx: Uint128::from(1u128), + }) + .unwrap(), + }); + + let env = mock_env_with_block_time(1000u64); + let info = mock_info("asset0000", &[]); + let res = execute(deps.as_mut(), env, info, msg).unwrap(); + assert_eq!( + res.messages, + vec![ + SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "asset0000".to_string(), + msg: to_binary(&Cw20ExecuteMsg::Transfer { + amount: Uint128::from(17u128), + recipient: "addr0001".to_string(), + }) + .unwrap(), + funds: vec![], + })), + SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "asset0000".to_string(), + msg: to_binary(&Cw20ExecuteMsg::Burn { + amount: Uint128::from(892u128), // 892 + 17 = 909 + }) + .unwrap(), + funds: vec![], + })), + SubMsg::new(CosmosMsg::Bank(BankMsg::Send { + to_address: "addr0001".to_string(), + amount: vec![Coin { + denom: "uusd".to_string(), + amount: Uint128::from(991u128) + }], + })), + SubMsg::new(CosmosMsg::Bank(BankMsg::Send { + to_address: "collector0000".to_string(), + amount: vec![Coin { + denom: "uusd".to_string(), + amount: Uint128::from(9u128) + }] + })) + ], + ); + assert_eq!( + res.attributes, + vec![ + attr("action", "auction"), + attr("position_idx", "1"), + attr("owner", "addr0000"), + attr("return_collateral_amount", "991uusd"), + attr("liquidated_amount", "892asset0000"), + attr("tax_amount", "0uusd"), + attr("protocol_fee", "9uusd"), + ] + ); +} diff --git a/contracts/mirror_staking/src/rewards.rs b/contracts/mirror_staking/src/rewards.rs index e39df84a..fb9dbb66 100644 --- a/contracts/mirror_staking/src/rewards.rs +++ b/contracts/mirror_staking/src/rewards.rs @@ -143,23 +143,22 @@ fn _withdraw_reward( let rewards_bucket = rewards_read(storage, staker_addr, is_short); // single reward withdraw - let reward_pairs: Vec<(CanonicalAddr, RewardInfo)>; - if let Some(asset_token) = asset_token { + let reward_pairs: Vec<(CanonicalAddr, RewardInfo)> = if let Some(asset_token) = asset_token { let reward_info = rewards_bucket.may_load(asset_token.as_slice())?; - reward_pairs = if let Some(reward_info) = reward_info { + if let Some(reward_info) = reward_info { vec![(asset_token.clone(), reward_info)] } else { vec![] - }; + } } else { - reward_pairs = rewards_bucket + rewards_bucket .range(None, None, Order::Ascending) .map(|item| { let (k, v) = item?; Ok((CanonicalAddr::from(k), v)) }) - .collect::>>()?; - } + .collect::>>()? + }; let mut amount: Uint128 = Uint128::zero(); for reward_pair in reward_pairs { @@ -238,41 +237,39 @@ fn _read_reward_infos( is_short: bool, ) -> StdResult> { let rewards_bucket = rewards_read(storage, staker_addr, is_short); - let reward_infos: Vec; - if let Some(asset_token) = asset_token { + let reward_infos: Vec = if let Some(asset_token) = asset_token { let asset_token_raw = api.addr_canonicalize(asset_token.as_str())?; - reward_infos = - if let Some(mut reward_info) = rewards_bucket.may_load(asset_token_raw.as_slice())? { - let pool_info = read_pool_info(storage, &asset_token_raw)?; - - let (pool_index, should_migrate) = if is_short { - (pool_info.short_reward_index, None) - } else if pool_info.migration_params.is_some() - && !read_is_migrated(storage, &asset_token_raw, staker_addr) - { - ( - pool_info.migration_params.unwrap().index_snapshot, - Some(true), - ) - } else { - (pool_info.reward_index, None) - }; - - before_share_change(pool_index, &mut reward_info)?; - - vec![RewardInfoResponseItem { - asset_token: asset_token.clone(), - bond_amount: reward_info.bond_amount, - pending_reward: reward_info.pending_reward, - is_short, - should_migrate, - }] + if let Some(mut reward_info) = rewards_bucket.may_load(asset_token_raw.as_slice())? { + let pool_info = read_pool_info(storage, &asset_token_raw)?; + + let (pool_index, should_migrate) = if is_short { + (pool_info.short_reward_index, None) + } else if pool_info.migration_params.is_some() + && !read_is_migrated(storage, &asset_token_raw, staker_addr) + { + ( + pool_info.migration_params.unwrap().index_snapshot, + Some(true), + ) } else { - vec![] + (pool_info.reward_index, None) }; + + before_share_change(pool_index, &mut reward_info)?; + + vec![RewardInfoResponseItem { + asset_token: asset_token.clone(), + bond_amount: reward_info.bond_amount, + pending_reward: reward_info.pending_reward, + is_short, + should_migrate, + }] + } else { + vec![] + } } else { - reward_infos = rewards_bucket + rewards_bucket .range(None, None, Order::Ascending) .map(|item| { let (k, v) = item?; @@ -303,8 +300,8 @@ fn _read_reward_infos( should_migrate, }) }) - .collect::>>()?; - } + .collect::>>()? + }; Ok(reward_infos) } diff --git a/packages/mirror_protocol/src/mint.rs b/packages/mirror_protocol/src/mint.rs index 82dd5790..2342b991 100644 --- a/packages/mirror_protocol/src/mint.rs +++ b/packages/mirror_protocol/src/mint.rs @@ -186,11 +186,3 @@ pub struct PositionsResponse { pub struct NextPositionIdxResponse { pub next_position_idx: Uint128, } - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct MigrateMsg { - pub collateral_oracle: String, - pub staking: String, - pub terraswap_factory: String, - pub lock: String, -}