#pool #assets #weighted #dexter #fee #weight #tokens

dexter-weighted-pool

实现Balancer提出的通用常数乘积AMM类型的Dexter DEX池

2个稳定版本

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

#2240 in 魔法豆

每月26次下载

MIT 许可证

98KB
1.5K SLoC

Dexter 协议 :: 加权池

Dexter的加权池基于特定的N维表面,该表面定义了池中任何一对代币交换的成本函数,这是由Balancer引入的。Dexter的加权池最多接受9个代币,一旦池初始化,权重不能更新。

与其他DeFi协议中的池只提供50/50的权重不同,Dexter的加权池允许用户构建不同代币数量和权重的池,例如80/20或60/20/20权重的池。

注意 - Dexter的加权池在池初始化期间接受exit_fee参数。exit_fee是用户从池中提取流动性时收取的百分比费用。所收取的退出费用的100%将分配给池的LP。 exit_fee不能超过1%。

合约状态

消息 描述
CONFIG Config结构体中存储池合约的核心配置参数
TWAPINFO Twap结构体中存储池支持的代币的Twap价格
MATHCONFIG 存储池的exit_feegreatest_precision配置参数
PRECISIONS 存储池支持的每个资产的小数精度
WEIGHTS 存储池支持的每个资产的归一化权重

  • 分离代币会计和池逻辑

    Dexter池只负责执行数学计算,这些计算决定了在交换/流动性提供事件期间要转移多少代币,并不处理代币的转移。Dexter的Vault查询池合约以计算要转移的代币数量,并自行处理这些转移。

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

支持的执行消息

消息 描述
ExecuteMsg::UpdateConfig 只能由Dexter Vault的所有者执行。加权池不支持
ExecuteMsg::UpdateLiquidity 只能由Dexter Vault执行。更新池的本地存储资产余额状态在 config.assets 中,并更新TWAP。

支持查询消息

消息 描述
QueryMsg::Config() 返回存储的Vault配置设置,在自定义 ConfigResponse 结构体中,包括 exit_fee 和归一化代币权重
QueryMsg::FeeParams() 返回提供的 PoolType 的配置设置,在自定义 FeeResponse 结构体中
QueryMsg::PoolId() 返回类型为 Uint128 的Pool ID
QueryMsg::OnJoinPool(assets_in,mint_amount,slippage_tolerance) 返回包含 - return_assets 信息、要发行的LP份额数量、类型为 ResponseTyperesponse 以及 Option<Asset>AfterJoinResponse 类型,它是需收取的费用。
QueryMsg::OnExitPool(assets_out,burn_amount) 返回包含 - assets_out 信息、要销毁的LP份额数量、类型为 ResponseTyperesponse 以及 Option<Asset>AfterExitResponse 类型,它是需收取的费用。
QueryMsg::OnSwap(swap_type,offer_asset,ask_asset,amount,max_spread,belief_price) 返回包含 - trade_params 信息、类型为 ResponseTyperesponse 以及 Option<Asset>SwapResponse 类型,它是需收取的费用。
QueryMsg::CumulativePrice(swap_type,offer_asset,ask_asset,amount,max_spread,belief_price) 返回包含累积价格信息的 CumulativePriceResponse 对象。
QueryMsg::累计价格( ) 返回有关 CumulativePricesResponse 对象中累计价格的信息。

枚举 & 结构体

MathConfig 结构体 - 该结构体描述了加权池的主要数学配置。

struct MathConfig {
    pub exit_fee: Option<Decimal>,
    /// The greatest precision of assets in the pool
    pub greatest_precision: u8,
}

WeightedAsset 结构体 - 该结构体描述了一个资产(原生或 CW20)及其归一化权重。

struct WeightedAsset {
    /// Information about an asset stored in a [`Asset`] struct
    pub asset: Asset,
    /// The weight of the asset
    pub weight: Decimal,
}

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

许可证

待定

依赖项

~9.5MB
~201K SLoC