🔁 交易所
合约接口 #
DODO提供了一个统一的DODOV2Proxy
接口,封装了底层所有的DODO池,允许在上层进行无缝的多阶段交易。开发者可以通过合约访问DODOV2Proxy
,并指定要连接到其合约用于交易目的的DODO流动性池。
如果交易者希望直接连接到底层池进行交易,他们需要区分DODO V1和DODO V2池(请参阅此处每个链上的池地址)。
访问DODO V2上的交易信息#
对于DODO V2池,函数的定义是统一的,提供了两个函数供开发者使用:sellBase
和 sellQuote
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池,两个暴露的函数是 sellBaseToken
和 buyBaseToken
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,开发者可以使用上述辅助合约的 querySellQuoteToken
和 querySellBaseToken
函数来预览交易结果。
注意:每个链上的 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)
getDODOPool
和 getDODOPoolBidirection
的区别在于,前者需要区分要传递的基础代币和报价代币,并以此顺序作为参数,而后者不需要区分基础代币和报价代币。调用 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);
NewDVM
和 RemoveDVM
是 DVMFactory 中的事件,NewDPP
和 RemoveDPP
是 DPPFactory 中的事件,NewDSP
和 RemoveDSP
是 DSPFactory 中的事件。