use crate::asset::{Asset, AssetInfo};
use crate::pool::ResponseType;
use crate::vault::SwapType;
use cosmwasm_schema::{cw_serde, QueryResponses};
use cosmwasm_std::{to_json_binary, Addr, CosmosMsg, StdResult, Uint128, WasmMsg};
pub const MAX_SWAP_OPERATIONS: usize = 50;
#[cw_serde]
pub struct InstantiateMsg {
pub dexter_vault: String,
}
#[cw_serde]
pub struct Config {
pub dexter_vault: Addr,
}
#[cw_serde]
pub struct HopSwapRequest {
pub pool_id: Uint128,
pub asset_in: AssetInfo,
pub asset_out: AssetInfo,
}
#[cw_serde]
pub enum ExecuteMsg {
ExecuteMultihopSwap {
requests: Vec<HopSwapRequest>,
offer_amount: Uint128,
recipient: Option<Addr>,
minimum_receive: Option<Uint128>,
},
Callback(CallbackMsg),
}
#[cw_serde]
pub enum CallbackMsg {
ContinueHopSwap {
requests: Vec<HopSwapRequest>,
offer_asset: AssetInfo,
prev_ask_amount: Uint128,
recipient: Addr,
minimum_receive: Uint128,
},
}
impl CallbackMsg {
pub fn to_cosmos_msg(&self, contract_addr: &Addr) -> StdResult<CosmosMsg> {
Ok(CosmosMsg::Wasm(WasmMsg::Execute {
contract_addr: String::from(contract_addr),
msg: to_json_binary(&ExecuteMsg::Callback(self.clone()))?,
funds: vec![],
}))
}
}
#[cw_serde]
#[derive(QueryResponses)]
pub enum QueryMsg {
#[returns(ConfigResponse)]
Config {},
#[returns(SimulateMultiHopResponse)]
SimulateMultihopSwap {
multiswap_request: Vec<HopSwapRequest>,
swap_type: SwapType,
amount: Uint128,
},
}
#[cw_serde]
pub struct ConfigResponse {
pub dexter_vault: String,
}
#[cw_serde]
pub struct SimulateMultiHopResponse {
pub swap_operations: Vec<SimulatedTrade>,
pub fee: Vec<Asset>,
pub response: ResponseType,
}
#[cw_serde]
pub struct SimulatedTrade {
pub pool_id: Uint128,
pub asset_in: AssetInfo,
pub offered_amount: Uint128,
pub asset_out: AssetInfo,
pub received_amount: Uint128,
}
#[cw_serde]
pub enum MigrateMsg {
V1_1 {}
}
pub fn return_swap_sim_failure(
suc_swaps: Vec<SimulatedTrade>,
error: String,
) -> SimulateMultiHopResponse {
SimulateMultiHopResponse {
swap_operations: suc_swaps,
fee: vec![],
response: ResponseType::Failure(error),
}
}