use cosmwasm_schema::{cw_serde, QueryResponses};
use crate::asset::AssetInfo;
use cosmwasm_std::{Addr, Order, Uint128};
use cw20::Cw20ReceiveMsg;
#[cw_serde]
pub struct InstantiateMsg {
pub owner: String,
pub vesting_token: AssetInfo,
}
#[cw_serde]
pub enum ExecuteMsg {
Claim {
recipient: Option<String>,
amount: Option<Uint128>,
},
Receive(Cw20ReceiveMsg),
RegisterVestingAccounts {
vesting_accounts: Vec<VestingAccount>,
},
WithdrawFromActiveSchedule {
account: String,
recipient: Option<String>,
withdraw_amount: Uint128,
},
ProposeNewOwner {
owner: String,
expires_in: u64,
},
DropOwnershipProposal {},
ClaimOwnership {},
}
#[cw_serde]
pub struct VestingAccount {
pub address: String,
pub schedules: Vec<VestingSchedule>,
}
#[cw_serde]
pub struct VestingInfo {
pub schedules: Vec<VestingSchedule>,
pub released_amount: Uint128,
}
#[cw_serde]
pub struct VestingSchedule {
pub start_point: VestingSchedulePoint,
pub end_point: Option<VestingSchedulePoint>,
}
#[cw_serde]
#[derive(Copy)]
pub struct VestingSchedulePoint {
pub time: u64,
pub amount: Uint128,
}
#[cw_serde]
#[derive(QueryResponses)]
pub enum QueryMsg {
#[returns(ConfigResponse)]
Config {},
#[returns(VestingAccountResponse)]
VestingAccount { address: String },
#[returns(VestingAccountsResponse)]
VestingAccounts {
start_after: Option<String>,
limit: Option<u32>,
order_by: Option<OrderBy>,
},
#[returns(Uint128)]
AvailableAmount { address: String },
#[returns(u64)]
Timestamp {},
}
#[cw_serde]
pub struct ConfigResponse {
pub owner: Addr,
pub vesting_token: AssetInfo,
}
#[cw_serde]
pub struct VestingAccountResponse {
pub address: Addr,
pub info: VestingInfo,
}
#[cw_serde]
pub struct VestingAccountsResponse {
pub vesting_accounts: Vec<VestingAccountResponse>,
}
#[cw_serde]
pub enum OrderBy {
Asc,
Desc,
}
#[allow(clippy::from_over_into)]
impl Into<Order> for OrderBy {
fn into(self) -> Order {
if self == OrderBy::Asc {
Order::Ascending
} else {
Order::Descending
}
}
}
#[cw_serde]
pub struct MigrateMsg {
pub converter_contract: String,
}
#[cw_serde]
pub enum Cw20HookMsg {
RegisterVestingAccounts {
vesting_accounts: Vec<VestingAccount>,
},
}