dexter 1.4.0

Dex optimized for liquid staked assets
Documentation
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 {
    /// The dexter Vault contract address
    pub dexter_vault: String,
}

#[cw_serde]
pub struct Config {
    /// The dexter vault contract address
    pub dexter_vault: Addr,
}

/// This enum describes a swap operation.
#[cw_serde]
pub struct HopSwapRequest {
    /// Pool Id via which the swap is to be routed
    pub pool_id: Uint128,
    /// The offer asset
    pub asset_in: AssetInfo,
    ///  The ask asset
    pub asset_out: AssetInfo,
}

/// This structure describes the execute messages available in the contract.
#[cw_serde]
pub enum ExecuteMsg {
    /// ExecuteMultihopSwap processes multiple swaps via dexter pools
    ExecuteMultihopSwap {
        requests: Vec<HopSwapRequest>,
        offer_amount: Uint128,
        recipient: Option<Addr>,
        minimum_receive: Option<Uint128>,
    },
    /// Callbacks; only callable by the contract itself.
    Callback(CallbackMsg),
}

#[cw_serde]
pub enum CallbackMsg {
    ContinueHopSwap {
        requests: Vec<HopSwapRequest>,
        offer_asset: AssetInfo,
        prev_ask_amount: Uint128,
        recipient: Addr,
        minimum_receive: Uint128,
    },
}

// Modified from
// https://github.com/CosmWasm/cosmwasm-plus/blob/v0.2.3/packages/cw20/src/receiver.rs#L15
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![],
        }))
    }
}

/// This structure describes the query messages available in the contract.
#[cw_serde]
#[derive(QueryResponses)]
pub enum QueryMsg {
    #[returns(ConfigResponse)]
    Config {},
    /// SimulateMultihopSwap simulates multi-hop swap operations
    #[returns(SimulateMultiHopResponse)]
    SimulateMultihopSwap {
        multiswap_request: Vec<HopSwapRequest>,
        swap_type: SwapType,
        amount: Uint128,
    },
}

#[cw_serde]
pub struct ConfigResponse {
    /// The dexter vault contract address
    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,
}

/// This structure describes a migration message.
/// We currently take no arguments for migrations.
#[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),
    }
}