DODO 文档中心

🔁 交易所

合约接口 #

DODO提供了一个统一的DODOV2Proxy接口,封装了底层所有的DODO池,允许在上层进行无缝的多阶段交易。开发者可以通过合约访问DODOV2Proxy,并指定要连接到其合约用于交易目的的DODO流动性池。

如果交易者希望直接连接到底层池进行交易,他们需要区分DODO V1和DODO V2池(请参阅此处每个链上的池地址)。

访问DODO V2上的交易信息#

对于DODO V2池,函数的定义是统一的,提供了两个函数供开发者使用:sellBasesellQuote

function sellBase(address to) external returns (uint256 receiveQuoteAmount);

sellBase 允许你出售基础代币并接收报价代币,并且需要交易者构建一个具有两个动作的交易。第一个动作是将要交换的基础代币转移到当前池子的子合约中,第二个动作是用交易的接收地址作为参数触发 sellBase 函数。

建议交易者在结算前对 receiveQuoteAmount 进行余额检查,以确保交易的安全执行。

function sellQuote(address to) external returns (uint256 receiveBaseAmount);

类似地,可以实现 sellQuote 函数来出售报价代币并接收基础代币。该函数也需要交易者构建一个具有两个动作的交易,第一个动作是将要交换的报价代币转移到当前池子的子合约中,第二个动作是用交易的接收地址作为参数触发 sellQuote 函数。

建议交易者在结算前对 receiveBaseAmount 进行余额检查,以确保交易的安全执行。

DODO V2 还提供了上述两个函数的预览结果。预览函数可以在不执行交易的情况下调用,帮助交易者估算价格以节省燃料费用。

注意:trader 是启动交易者的公钥地址。

function querySellBase(
    address trader,
    uint256 payBaseAmount
) external view  returns (uint256 receiveQuoteAmount,uint256 mtFee);

function querySellQuote(
    address trader,
    uint256 payQuoteAmount
) external view  returns (uint256 receiveBaseAmount,uint256 mtFee);

访问DODO V1上的交易信息#

对于DODO V1池,两个暴露的函数是 sellBaseTokenbuyBaseToken

  function sellBaseToken(
      uint256 amount,
      uint256 minReceiveQuote,
      bytes calldata data
  ) external returns (uint256 receiveQuoteAmount);

该函数要求交易者构建一笔交易,第一个动作是授权要出售给池子的 baseToken,第二个动作是执行 sellBaseToken 函数。

建议交易者在结算前对 receiveQuoteAmount 进行余额检查,以确保交易的安全执行。

  function buyBaseToken(
       uint256 amount,
       uint256 maxPayQuote,
       bytes calldata data
  ) external returns (uint256 payQuoteAmount);

buyBaseToken 可以通过出售报价代币来购买基础代币,但它的区别在于,合约的 amount 参数需要传递要购买的基础代币的数量。这个值需要事先用第二个参数的 maxPayQuote 来计算,maxPayQuote 是要出售的报价代币数量。

DODO为每条链提供了辅助合约,允许开发者调用 querySellQuoteToken 接口函数,通过传入他们想要出售的报价代币数量和指定的DODO V1池地址,快速获取可以购买的基础代币数量。这样,他们就获得了触发 buyBaseToken 函数所需的所有信息。

辅助合约的接口描述如下:

  function querySellQuoteToken(
       address dodoV1Pool,
       uint256 quoteAmount
  ) public view returns (uint256 receiveBaseAmount);
  function querySellBaseToken(
        address dodoV1Pool,
        uint256 baseAmount
  ) public view returns (uint256 receiveQuoteAmount);

类似于 DODO V1,开发者可以使用上述辅助合约的 querySellQuoteTokenquerySellBaseToken 函数来预览交易结果。

注意:每个链上的 DODO V1 池地址和辅助合约地址可以在合约部署详细信息页面上找到。

访问DODOV2Proxy交易#

开发者还可以直接访问DODOV2Proxy来实现对DODOV2或DODOV1的交易,以及通过构造参数来实现多跳交易。有关如何访问的详细信息,请参阅以下代码示例DODOProxyIntegrate.sol

最后,无论是在DODO V1还是DODO V2池中,PMM算法都用于确定这些池中代币的买入和卖出价格。当开发者需要离链计算池的价格和池中的买卖数量时,他们可以参考下面的脚本,该脚本实现了PMM算法,并可以直接在离链上使用:pmmOffchainCalc.ts

流动性池注册表#

开发者可以从工厂合约(分别需要调用 DPPFactory&&DVMFactory&& DSPFactory)中获取平台上已创建的所有池地址,用于池地址的显示等功能。

function getDODOPool(
    address baseToken,
    address quoteToken
) external view returns (address[] memory pools)

function getDODOPoolBidirection(
    address token0,
    address token1
) external view returns (address[] memory baseToken0Pool, address[] memory baseToken1Pool)

function getDODOPoolByUser(
    address user
) external view returns (address[] memory pools)

getDODOPoolgetDODOPoolBidirection 的区别在于,前者需要区分要传递的基础代币和报价代币,并以此顺序作为参数,而后者不需要区分基础代币和报价代币。调用 getDODOPoolBidirection 的结果由两个数组组成,分别对应以 token0 作为基础代币的池列表,以及以 token1 作为基础代币的池列表。最后一个查询函数以创建者的地址作为参数,并返回与该账户相关的池列表。

此外,我们还为DODO平台上的池创建和删除事件提供了实时监控,以便更轻松地维护平台上的最新池列表。

  event NewDVM(address baseToken,address quoteToken,address creator,address dvm);
  event RemoveDVM(address dvm);

  event NewDPP(address baseToken,address quoteToken,address creator,address dpp);
  event RemoveDPP(address dpp);

  event NewDSP(address baseToken,address quoteToken,address creator,address dsp);
 event RemoveDSP(address dsp);

NewDVMRemoveDVM 是 DVMFactory 中的事件,NewDPPRemoveDPP 是 DPPFactory 中的事件,NewDSPRemoveDSP 是 DSPFactory 中的事件。