1use std::fmt;
2
3use fuzion_std::FeeCollector;
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7use cosmwasm_std::{Addr, Decimal, Uint128};
8
9#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
10#[serde(rename_all = "snake_case")]
11pub enum ExecuteMsg {
12 UpdateConfig(UpdateConfigMsg),
13 ConfirmConfig {},
14 CreateFlows {
15 flow_list: Vec<FlowCreate>,
16 },
17 CreateFlowTemplate {
18 flow_template: FlowTemplateCreate,
19 },
20 CreateFlowFromTemplate {
21 template_id: u64,
22 taker: Addr,
23 identifier: Option<String>,
24 },
25 Claim {
26 id: u64,
27 },
28}
29
30#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
31#[serde(rename_all = "snake_case")]
32pub struct ConfigMsg {
33 pub admins: Admins,
34 pub contracts: Contracts,
35 pub flow_type_config: Vec<FlowTypeConfigMsg>,
36}
37
38#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
39#[serde(rename_all = "snake_case")]
40pub struct UpdateConfigMsg {
41 pub admins: Option<Admins>,
42 pub contracts: Option<Contracts>,
43 pub flow_type_config: Option<Vec<FlowTypeConfigMsg>>,
44}
45
46#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
47#[serde(rename_all = "snake_case")]
48pub struct Admins {
49 pub config_admin: Addr,
50 pub confirm_admin: Addr,
51}
52
53#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
54#[serde(rename_all = "snake_case")]
55pub struct Contracts {
56 pub oracle_price_contract: Addr,
57 pub utilities_contract: Addr,
58 pub funds_distributor_contract: Addr,
59}
60
61#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
62#[serde(rename_all = "snake_case")]
63pub struct FlowTypeConfigMsg {
64 pub flow_type: FlowType,
65 pub fee: Decimal,
66 pub partner_fee: Decimal,
67 pub fee_collectors: Vec<FeeCollector>,
68}
69
70#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
71pub struct FlowTemplateCreate {
72 pub flow_type: FlowType,
73 pub genesis_time: u64,
74 pub maker: Option<Addr>,
75 pub identifier: Option<u64>,
76 pub schedules: Vec<FlowTemplateSchedule>,
77}
78
79#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
80pub struct FlowCreate {
81 pub flow_type: FlowType,
82 pub taker: Addr,
83 pub denom: String,
84 pub identifier: Option<String>,
85 pub genesis_time: u64,
86 pub schedules: Vec<FlowSchedule>,
87}
88
89#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)]
90pub enum FlowType {
91 Vesting,
92}
93
94impl fmt::Display for FlowType {
95 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
96 write!(f, "{self:?}")
97 }
98}
99
100#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
101pub struct FlowTemplateSchedule {
102 pub start_time: u64,
103 pub end_time: u64,
104 pub cliff_end_time: u64,
105 pub percent: Uint128,
106}
107
108#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
109pub struct FlowSchedule {
110 pub start_time: u64,
111 pub end_time: u64,
112 pub cliff_end_time: u64,
113 pub amount: Uint128,
114}
115
116#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
117pub struct ExtendedFlowSchedule {
118 pub start_time: u64,
119 pub end_time: u64,
120 pub cliff_end_time: u64,
121 pub amount: Uint128,
122 pub claimed: Uint128,
123 pub claimable: Uint128,
124}
125
126impl ExtendedFlowSchedule {
127 pub fn new(
128 start_time: u64,
129 end_time: u64,
130 cliff_end_time: u64,
131 amount: Uint128,
132 claimed: Uint128,
133 claimable: Uint128,
134 ) -> Self {
135 Self {
136 start_time,
137 end_time,
138 cliff_end_time,
139 amount,
140 claimed,
141 claimable,
142 }
143 }
144}