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中的事件