🔁

资金池交易

合约接口

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