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 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 UpdateAsset {
47 asset_token: String,
48 auction_discount: Option<Decimal>,
49 min_collateral_ratio: Option<Decimal>,
50 ipo_params: Option<IPOParams>,
51 },
52 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 TriggerIPO {
65 asset_token: String,
66 },
67
68 OpenPosition {
73 collateral: Asset,
74 asset_info: AssetInfo,
75 collateral_ratio: Decimal,
76 short_params: Option<ShortParams>,
77 },
78 Deposit {
80 position_idx: Uint128,
81 collateral: Asset,
82 },
83 Withdraw {
85 position_idx: Uint128,
86 collateral: Option<Asset>,
87 },
88 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 OpenPosition {
114 asset_info: AssetInfo,
115 collateral_ratio: Decimal,
116 short_params: Option<ShortParams>,
117 },
118 Deposit { position_idx: Uint128 },
120 Burn { position_idx: Uint128 },
122 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#[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#[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}