mirror_protocol/
mint.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use cosmwasm_std::{Decimal, Uint128};
5use cw20::Cw20ReceiveMsg;
6use terraswap::asset::{Asset, AssetInfo};
7
8use crate::common::OrderBy;
9
10#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
11pub struct InstantiateMsg {
12    pub owner: String,
13    pub oracle: String,
14    pub collector: String,
15    pub collateral_oracle: String,
16    pub staking: String,
17    pub terraswap_factory: String,
18    pub lock: String,
19    pub base_denom: String,
20    pub token_code_id: u64,
21    pub protocol_fee_rate: Decimal,
22}
23
24#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
25#[serde(rename_all = "snake_case")]
26pub enum ExecuteMsg {
27    Receive(Cw20ReceiveMsg),
28
29    //////////////////////
30    /// Owner Operations
31    //////////////////////
32
33    /// Update config; only owner is allowed to execute it
34    UpdateConfig {
35        owner: Option<String>,
36        oracle: Option<String>,
37        collector: Option<String>,
38        collateral_oracle: Option<String>,
39        terraswap_factory: Option<String>,
40        lock: Option<String>,
41        token_code_id: Option<u64>,
42        protocol_fee_rate: Option<Decimal>,
43        staking: Option<String>,
44    },
45    /// Update asset related parameters
46    UpdateAsset {
47        asset_token: String,
48        auction_discount: Option<Decimal>,
49        min_collateral_ratio: Option<Decimal>,
50        ipo_params: Option<IPOParams>,
51    },
52    /// Generate asset token initialize msg and register required infos except token address
53    RegisterAsset {
54        asset_token: String,
55        auction_discount: Decimal,
56        min_collateral_ratio: Decimal,
57        ipo_params: Option<IPOParams>,
58    },
59    RegisterMigration {
60        asset_token: String,
61        end_price: Decimal,
62    },
63    /// Asset feeder is allowed to trigger IPO event on preIPO assets
64    TriggerIPO {
65        asset_token: String,
66    },
67
68    //////////////////////
69    /// User Operations
70    //////////////////////
71    // Create position to meet collateral ratio
72    OpenPosition {
73        collateral: Asset,
74        asset_info: AssetInfo,
75        collateral_ratio: Decimal,
76        short_params: Option<ShortParams>,
77    },
78    /// Deposit more collateral
79    Deposit {
80        position_idx: Uint128,
81        collateral: Asset,
82    },
83    /// Withdraw collateral
84    Withdraw {
85        position_idx: Uint128,
86        collateral: Option<Asset>,
87    },
88    /// Convert all deposit collateral to asset
89    Mint {
90        position_idx: Uint128,
91        asset: Asset,
92        short_params: Option<ShortParams>,
93    },
94}
95
96#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
97pub struct ShortParams {
98    pub belief_price: Option<Decimal>,
99    pub max_spread: Option<Decimal>,
100}
101
102#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
103pub struct IPOParams {
104    pub mint_end: u64,
105    pub pre_ipo_price: Decimal,
106    pub min_collateral_ratio_after_ipo: Decimal,
107}
108
109#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
110#[serde(rename_all = "snake_case")]
111pub enum Cw20HookMsg {
112    // Create position to meet collateral ratio
113    OpenPosition {
114        asset_info: AssetInfo,
115        collateral_ratio: Decimal,
116        short_params: Option<ShortParams>,
117    },
118    /// Deposit more collateral
119    Deposit { position_idx: Uint128 },
120    /// Convert specified asset amount and send back to user
121    Burn { position_idx: Uint128 },
122    /// Buy discounted collateral from the contract with their asset tokens
123    Auction { position_idx: Uint128 },
124}
125
126#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
127#[serde(rename_all = "snake_case")]
128pub enum QueryMsg {
129    Config {},
130    AssetConfig {
131        asset_token: String,
132    },
133    Position {
134        position_idx: Uint128,
135    },
136    Positions {
137        owner_addr: Option<String>,
138        asset_token: Option<String>,
139        start_after: Option<Uint128>,
140        limit: Option<u32>,
141        order_by: Option<OrderBy>,
142    },
143    NextPositionIdx {},
144}
145
146// We define a custom struct for each query response
147#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
148pub struct ConfigResponse {
149    pub owner: String,
150    pub oracle: String,
151    pub collector: String,
152    pub collateral_oracle: String,
153    pub staking: String,
154    pub terraswap_factory: String,
155    pub lock: String,
156    pub base_denom: String,
157    pub token_code_id: u64,
158    pub protocol_fee_rate: Decimal,
159}
160
161// We define a custom struct for each query response
162#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
163pub struct AssetConfigResponse {
164    pub token: String,
165    pub auction_discount: Decimal,
166    pub min_collateral_ratio: Decimal,
167    pub end_price: Option<Decimal>,
168    pub ipo_params: Option<IPOParams>,
169}
170
171#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
172pub struct PositionResponse {
173    pub idx: Uint128,
174    pub owner: String,
175    pub collateral: Asset,
176    pub asset: Asset,
177    pub is_short: bool,
178}
179
180#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug, Default)]
181pub struct PositionsResponse {
182    pub positions: Vec<PositionResponse>,
183}
184
185#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug, Default)]
186pub struct NextPositionIdxResponse {
187    pub next_position_idx: Uint128,
188}
189
190#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
191pub struct MigrateMsg {
192    pub collateral_oracle: String,
193    pub staking: String,
194    pub terraswap_factory: String,
195    pub lock: String,
196}