1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use cosmwasm_std::{Addr, Api, StdResult, Uint128};
5use cw20::Cw20ReceiveMsg;
6
7#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema, Copy)]
8pub struct Schedule {
9 pub start_time: u64,
11 pub cliff: u64,
13 pub duration: u64,
16}
17
18#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
19pub struct Config<T> {
20 pub address_provider_address: T,
23 pub unlock_schedule: Schedule,
25}
26
27impl From<Config<Addr>> for Config<String> {
28 fn from(config: Config<Addr>) -> Self {
29 Config {
30 address_provider_address: config.address_provider_address.to_string(),
31 unlock_schedule: config.unlock_schedule,
32 }
33 }
34}
35
36impl Config<String> {
37 pub fn check(&self, api: &dyn Api) -> StdResult<Config<Addr>> {
38 Ok(Config {
39 address_provider_address: api.addr_validate(&self.address_provider_address)?,
40 unlock_schedule: self.unlock_schedule,
41 })
42 }
43}
44
45#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
46pub struct Allocation {
47 pub allocated_amount: Uint128,
49 pub withdrawn_amount: Uint128,
51 pub vest_schedule: Schedule,
53}
54
55pub mod msg {
56 use super::*;
57
58 pub type InstantiateMsg = Config<String>;
59
60 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
61 #[serde(rename_all = "snake_case")]
62 pub enum ExecuteMsg {
63 Receive(Cw20ReceiveMsg),
65 Withdraw {},
67 }
68
69 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
70 #[serde(rename_all = "snake_case")]
71 pub enum ReceiveMsg {
72 CreateAllocation {
74 user_address: String,
75 vest_schedule: Schedule,
76 },
77 }
78
79 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
80 #[serde(rename_all = "snake_case")]
81 pub enum QueryMsg {
82 Config {},
84 Allocation { user_address: String },
86 VotingPowerAt { user_address: String, block: u64 },
90 TotalVotingPowerAt { block: u64 },
93 }
94}