use cosmwasm_std::{Coin, CosmosMsg};
use injective_cosmwasm::{InjectiveMsgWrapper, SubaccountId};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_cw_value::Value;
use crate::vault::{AmmRedeemSubscribeMsg, InstantiateVaultMsg, RedemptionType, Slippage, Vault};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct InstantiateMsg {
pub owner: String,
pub distribution_contract: String, pub mito_token: String,
pub is_allowing_open_registrations: bool,
pub is_opting_out_rewards: bool,
pub permissionless_vault_registration_fee: Vec<Coin>,
pub min_permissionless_vault_initial_funds: Vec<Coin>,
pub mito_treasury_address: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub struct InjectiveForwardExec {
pub vault_subaccount_id: SubaccountId,
pub trader_subaccount_id: SubaccountId,
pub msg: Value,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub struct AmmInjectiveForwardExec {
pub vault_subaccount_id: SubaccountId,
pub trader_subaccount_id: SubaccountId,
pub msg: AmmRedeemSubscribeMsg,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[allow(clippy::large_enum_variant)]
pub enum MasterAmmExecuteMsg {
InjectiveExec {
origin: String,
name: String,
args: AmmInjectiveForwardExec,
},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct PermissionlessInfo {
pub whitelisted_vault_code_id: u64,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct RestrictedInfo {
pub vault_code_id: u64,
pub vault_upgrade_admin: Option<String>, pub vault_label: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RegistrationMode {
Permissionless(PermissionlessInfo),
Restricted(RestrictedInfo),
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
#[allow(clippy::large_enum_variant)]
pub enum ExecuteMsg {
InjectiveExec {
origin: String,
name: String,
args: InjectiveForwardExec,
},
AddAllowedVaultRegistrationAddress {
address: String,
},
RemoveAllowedVaultRegistrationAddress {
address: String,
},
AddOneTimeAllowedVaultRegistrationAddress {
address: String,
code_id: u64,
},
AddCodeIdToWhitelist {
code_id: u64,
},
RemoveCodeIdFromWhitelist {
code_id: u64,
},
UpdateConfig {
owner: Option<String>,
distribution_contract: Option<String>,
is_allowing_open_registrations: Option<bool>,
permissionless_vault_registration_fee: Option<Vec<Coin>>,
min_permissionless_vault_initial_funds: Option<Vec<Coin>>,
mito_treasury_address: Option<String>,
},
ExecuteMessagesForVault {
injective_messages: Vec<CosmosMsg<InjectiveMsgWrapper>>,
},
RegisterVault {
registration_mode: RegistrationMode,
instantiate_vault_msg: InstantiateVaultMsg,
is_subscribing_with_funds: bool,
},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
Config {},
GetLastRegisteredVault {},
HasOneTimeAllowance {
user_address: String,
code_id: u64,
},
GetRegisteredVaults {
start_after_vault_addr: Option<String>,
start_after_subaccount: Option<SubaccountId>,
limit: Option<u32>,
},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct RegisteredVault {
pub vault: Vault,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct RegisteredVaultsResponse {
pub registered_vaults: Vec<RegisteredVault>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct ConfigResponse {
pub owner: String,
pub distribution_contract: String, pub mito_token: String,
pub mito_treasury_address: String,
pub is_allowing_open_registrations: bool,
pub permissionless_vault_registration_fee: Vec<Coin>,
pub min_permissionless_vault_initial_funds: Vec<Coin>,
pub version: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct VaultSubscribeArgs {
pub vault_subaccount_id: SubaccountId,
pub subscriber_subaccount_id: SubaccountId,
pub slippage: Option<Slippage>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct VaultRedeemArgs {
pub vault_subaccount_id: SubaccountId,
pub redeemer_subaccount_id: SubaccountId,
pub redemption_type: RedemptionType,
pub slippage: Option<Slippage>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub enum VaultInputArgs {
Subscribe { args: VaultSubscribeArgs },
Redeem { args: VaultRedeemArgs },
}