1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use cosmwasm_std::{Decimal, Uint128};
5use cw20::Cw20ReceiveMsg;
6use terraswap::asset::AssetInfo;
7
8#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
9pub struct InstantiateMsg {
10 pub custom_treasury: String,
11 pub principal_token: AssetInfo,
12 pub olympus_treasury: String,
13 pub subsidy_router: String,
14 pub initial_owner: String,
15 pub olympus_dao: String,
16 pub fee_tiers: Vec<FeeTier>,
17 pub fee_in_payout: bool,
18}
19
20#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
21#[serde(rename_all = "snake_case")]
22pub enum ExecuteMsg {
23 Receive(Cw20ReceiveMsg),
24 InitializeBond {
25 terms: Terms,
26 initial_debt: Uint128,
27 },
28 SetBondTerms {
29 vesting_term: Option<u64>,
30 max_payout: Option<Decimal>,
31 max_debt: Option<Uint128>,
32 },
33 SetAdjustment {
34 addition: bool,
35 increment: Decimal,
36 target: Decimal,
37 buffer: u64,
38 },
39 UpdatePolicy {
40 policy: String,
41 },
42 UpdateOlympusTreasury {
43 olympus_treasury: String,
44 },
45 PaySubsidy {},
46 Deposit {
47 max_price: Decimal,
48 depositor: String,
49 },
50 Redeem {},
51}
52
53#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
54#[serde(rename_all = "snake_case")]
55pub enum Cw20HookMsg {
56 Deposit {
57 max_price: Decimal,
58 depositor: String,
59 },
60}
61
62#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
63#[serde(rename_all = "snake_case")]
64pub struct MigrateMsg {}
65
66#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
67#[serde(rename_all = "snake_case")]
68pub enum QueryMsg {
69 Config {},
70 State {},
71 BondPrice {},
72 PayoutFor { value: Uint128 },
73 CurrentDebt {},
74 CurrentOlympusFee {},
75 BondInfo { user: String },
76}
77
78#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
80pub struct ConfigResponse {
81 pub custom_treasury: String,
82 pub payout_token: String,
83 pub principal_token: AssetInfo,
84 pub olympus_treasury: String,
85 pub subsidy_router: String,
86 pub policy: String,
87 pub olympus_dao: String,
88 pub fee_tiers: Vec<FeeTier>,
89 pub fee_in_payout: bool,
90}
91
92#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, Default)]
93pub struct Terms {
94 pub control_variable: Decimal,
95 pub vesting_term: u64,
96 pub minimum_price: Decimal,
97 pub max_payout: Decimal,
98 pub max_debt: Uint128,
99}
100
101#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, Default)]
102pub struct Adjustment {
103 pub addition: bool,
104 pub rate: Decimal,
105 pub target: Decimal,
106 pub buffer: u64,
107 pub last_time: u64,
108}
109
110#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, Default)]
111pub struct State {
112 pub total_debt: Uint128,
113 pub terms: Terms,
114 pub last_decay: u64,
115 pub adjustment: Adjustment,
116 pub payout_since_last_subsidy: Uint128,
117 pub total_principal_bonded: Uint128,
118 pub total_payout_given: Uint128,
119}
120
121#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
122pub struct FeeTier {
123 pub tier_ceiling: Uint128,
124 pub fee_rate: Decimal,
125}
126
127#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, Default)]
128pub struct BondInfo {
129 pub payout: Uint128,
130 pub vesting: u64,
131 pub last_time: u64,
132 pub true_price_paid: Decimal,
133}
134
135#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, Default)]
136pub struct BondInfoResponse {
137 pub info: BondInfo,
138 pub pending_payout: Uint128,
139}