#pool #assets #swap #price #dexter #compute #amount

dexter-stable-pool

实现稳定swap和元稳定AMM模型的Dexter DEX池

1个稳定版本

1.1.1 2024年4月1日
1.1.0 2024年3月6日

#2475 in 神奇豆子

每月下载 31次

MIT 许可证

135KB
2K SLoC

Dexter 协议 :: Stable-5-Pool

Dexter的Stable-5-Pool实现了池中最多5个资产的稳定swap不变量,并实现了流动性提供/提取和掉期计算的计算。

合约状态

消息 描述
CONFIG 将池合约的核心配置参数存储在Config结构体中
TWAPINFO 将池支持的代币的Twap价格存储在Twap结构体中
MATHCONFIG 存储与稳定swap不变量相关的自定义配置参数,如AMP参数

  • 分离代币会计和池逻辑

    Dexter池只负责数学计算,这些计算决定了在掉期/流动性提供事件期间要转移的代币数量,并且不处理代币转移本身。Dexter的保险库查询池合约以计算要转移的代币数量,并自行处理这些转移。

    这种分离简化了池合约,因为它们不再需要积极管理其资产;池只需要计算掉期、加入和退出的金额。任何有新颖交易系统想法的人都可以创建自定义池,并通过Dexter的PoolType注册表获得Dexter DAO的批准,而不是需要构建自己的去中心化交易所。

支持的执行消息

消息 描述
ExecuteMsg::UpdateConfig 只能由Dexter保险库的所有者执行。使用在params变量中指定的参数更新池的数学配置。仅接受StartChangingAmpStopChangingAmp命令
ExecuteMsg::UpdateLiquidity 只能由Dexter保险库执行。更新池在config.assets中本地存储的资产余额状态,并更新Twap。

支持的查询消息

消息 描述
QueryMsg::Config() 返回存储的保险库配置设置,以自定义 ConfigResponse 结构体
QueryMsg::FeeParams() 返回提供的 PoolType 的配置设置,以自定义 FeeResponse 结构体
QueryMsg::PoolId() 返回池 ID,类型为 Uint128
QueryMsg::OnJoinPool(assets_in,mint_amount,slippage_tolerance) 返回 AfterJoinResponse 类型,其中包含 - return_assets 信息、待铸成的 LP 代币数量、类型为 ResponseTyperesponse 以及类型为 Option<Asset>fee,这是要收取的费用。
QueryMsg::OnExitPool(assets_out,burn_amount) 返回 AfterExitResponse 类型,其中包含 - assets_out 信息、待销毁的 LP 代币数量、类型为 ResponseTyperesponse 以及类型为 Option<Asset>fee,这是要收取的费用。
QueryMsg::OnSwap(swap_type,offer_asset,ask_asset,amount,max_spread,belief_price) 返回 SwapResponse 类型,其中包含 - trade_params 信息、类型为 ResponseTyperesponse 以及类型为 Option<Asset>fee,这是要收取的费用。
QueryMsg::CumulativePrice(swap_type,offer_asset,ask_asset,amount,max_spread,belief_price) 返回关于资产累积价格的 CumulativePriceResponse 对象中的信息。
QueryMsg::CumulativePrices( ) 返回关于累积价格的 CumulativePricesResponse 对象中的信息。

枚举 & 结构体

MathConfig 结构体 - 此结构体描述了稳定池的主要数学配置。

struct MathConfig {
    // This is the current amplification used in the pool
    pub init_amp: u64,
    // This is the start time when amplification starts to scale up or down
    pub init_amp_time: u64,
    // This is the target amplification to reach at `next_amp_time`
    pub next_amp: u64,
    // This is the timestamp when the current pool amplification should be `next_amp`
    pub next_amp_time: u64,
    /// The greatest precision of assets in the pool
    pub greatest_precision: u8,
}

StablePoolUpdateParams 枚举 - 此枚举存储了用于启动和停止更改稳定swap池的放大倍数的选项。在 Execute::UpdateConfig 函数中使用。

enum StablePoolUpdateParams {
    StartChangingAmp { next_amp: u64, next_amp_time: u64 },
    StopChangingAmp {},
}

ResponseType 枚举 - 此枚举用于描述数学计算(连接/退出/交换)是否成功

enum ResponseType {
    Success {},
    Failure (String),
}

Config 结构体 - 此结构体描述了池的主控制配置。

struct Config {
    /// ID of contract which is allowed to create pools of this type
    pub pool_id: Uint128,
    /// The address of the LP token associated with this pool
    pub lp_token_addr: Option<Addr>,
    /// the vault contract address
    pub vault_addr: Addr,
    /// Assets supported by the pool
    pub assets: Vec<Asset>,
    /// The pools type (provided in a [`PoolType`])
    pub pool_type: PoolType,
    /// The Fee details of the pool
    pub fee_info: FeeStructs,
    /// The block time when pool liquidity was last updated
    pub block_time_last: u64,
}

Trade 结构体 - 此辅助结构体用于交换操作。

struct Trade {
    /// The number of tokens to be sent by the user to the Vault
    pub amount_in: Uint128,
    /// The number of tokens to be received by the user from the Vault
    pub amount_out: Uint128,
    /// The spread associated with the swap tx
    pub spread: Uint128,
}

AfterJoinResponse 结构体 - 用于 QueryMsg::OnJoinPool

struct AfterJoinResponse {
    // Is a sorted list consisting of amount of info of tokens which will be provided by the user to the Vault as liquidity
    pub provided_assets: Vec<Asset>,
    // Is the amount of LP tokens to be minted
    pub new_shares: Uint128,
    // Is the response type :: Success or Failure
    pub response: ResponseType,
    // Is the fee to be charged
    pub fee: Option<Asset>,
}

AfterExitResponse 结构体 - 用于 QueryMsg::OnExitPool

struct AfterExitResponse {
    /// Assets which will be transferred to the recipient against tokens being burnt
    pub assets_out: Vec<Asset>,
    /// Number of LP tokens to burn
    pub burn_shares: Uint128,
    /// Operation will be a `Success` or `Failure`
    pub response: ResponseType,
    /// Fee to be charged
    pub fee: Option<Asset>,
}

SwapResponse 结构体 - 用于 QueryMsg::OnSwap

struct SwapResponse {
    ///  Is of type [`Trade`] which contains all params related with the trade
    pub trade_params: Trade,
    /// Operation will be a `Success` or `Failure`
    pub response: ResponseType,
    /// Fee to be charged
    pub fee: Option<Asset>,
}

CumulativePriceResponse 结构体 - 用于 QueryMsg::CumulativePrice

struct CumulativePriceResponse {
    pub exchange_info: AssetExchangeRate,
    pub total_share: Uint128,
}

CumulativePricesResponse 结构体 - 用于 QueryMsg::CumulativePrices

struct CumulativePricesResponse {
    pub exchange_info: Vec<AssetExchangeRate>,
    pub total_share: Uint128,
}

构建模式和运行单元测试

cargo schema
cargo test

许可证

待定

依赖项

~9MB
~182K SLoC