Skip to main content
Version: 2.0.0

合约交易说明

合约接口

DODO 提供了统一的 DODOV2Proxy,针对底层的池子进行封装,可以在上层实现多跳池子连续交易。开发者可以通过合约的方式接入 DODOV2Proxy,同样也可以指定 DODO 流动性池,对接合约实现交易。

若交易者希望直接对接底层池子进行交易,需要区分 DODOV1 以及 DODOV2 池 (各链 DODOV1 池子地址信息见合约部署页)。

接入 DODOV2 交易

首先对于 DODOV2 池,我们进行了统一定义,暴露出两个函数可供开发者使用: sellBasesellQuote

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

sellBase 可以实现卖出 base token,得到 quote token。这个函数需要交易者构造一笔包含两个动作的交易,第一个动作是转入需要交换的 base token 至当前池子合约中,第二个动作是将交换的接收地址作为参数,触发 sellBase。结束前建议交易者对 receiveQuoteAmount 进行余额检查,以确保交易的安全执行

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

同理,sellQuote 可以实现卖出 quote token,得到 base token。这个函数同样需要交易者构造一笔包含两个动作的交易,第一个动作是转入需要交换的 quote token 至当前池子合约中,第二个动作是将交换的接收地址作为参数,触发 sellQuote。结束前建议交易者对 receiveBaseAmount 进行余额检查,以确保交易的安全执行

DODO V2 同样会提供以上两个函数的结果预览,预览函数可以在不发送交易的情况下执行,帮助交易者预估价格,以节省 gas 费。注:传入的 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);

接入 DODOV1 交易

DODOV1 池,暴露出的两个函数是 sellBaseTokenbuyBaseToken

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

sellBaseToken 可以实现卖出 base token,得到 quote token。这个函数需要交易者构造一笔包含两个动作的交易,第一个动作是需要将卖出的 baseToken 授权给池子,第二个动作是触发 sellBaseToken。结束前建议交易者对 receiveQuoteAmount 进行余额检查,以确保交易的安全执行

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

buyBaseToken 可以通过卖出 quote Token,实现买入 base Token。但不太一样的是,合约第一个参数需要传入买进的 base amount。这个值需要事前通过 maxPayQuote 即传入合约第二个参数,希望卖出的 quote Token 数量计算而来。DODO 在各链提供了 Helper 合约,开发者可以调用 querySellQuoteToken 快速的通过传入希望卖出的 quote amount 以及指定 DODOV1 的池子地址,得到可以买进的 base amount。这样就得到了触发 buyBaseToken 函数的全部参数。Helper 合约的接口说明如下:

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

同样,针对 DODO V1 开发者可以使用以上 Helper 合约的 querySellQuoteToken && querySellBaseToken 两个函数, 预览交易结果

  • 注:各链 DODOV1 池子地址以及各链 Helper 合约地址可详见 合约部署详情页 *

接入 DODOV2Proxy 交易

开发者也可以直接接入 DODOV2Proxy 实现针对 DODOV2 或 DODOV1 的交易,同时还可以通过构造参数,实现多跳交易。具体的接入方法,可以参考如下代码样例 DODOProxyIntegrate.sol

最后,不管是 DODOV1 还是 DODOV2,背后均采用的是 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)

getDODOPool 与 getDODOPoolBidirection 的区别是前者需要区分出 base、quote 按序作为参数传入,而后者不需要区分 base、quote,检索出的结果包括两个数组,分别对应 token0 为 base 的池子列表,以及 token1 为 base 的池子列表。最后一个检索函数以创建者地址作为参数,获取其账户下创建的池子列表

同时,我们提供了实时监听 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);

其中 NewDVMRemoveDVMDVMFactory 中的事件,NewDPPRemoveDPPDPPFactory 中的事件,NewDSPRemoveDSPDSPFactory 中的事件