💵 做市商制度
DODO平台上提供的当前流动池类型包括:
- DODO V2 做市商流动池 - 专业做市商专用
- DODO V2 单币流动池 - 任何用户都可参与,单边初始化流动性方案
- DODO V2 锚定流动池 - 任何用户都可参与,用于合成资产
- DODO V1 标准流动池 - 任何用户都可参与,双币种模型
DODO V2 做市商流动池 #
DODO V2 做市商流动池允许做市商以自己的资金进行独立的市场推广,而且在做市过程中可以灵活修改流动池的配置。可修改的因素包括交易手续费率、当前外部引导价格 I、曲线滑点系数 k,以及流动池的资本规模。这些修改是由触发智能合约的帐户进行的,从而实现了动态的链上做市调整。
工作原理 #
做市商可以通过调用 DODO V2Proxy02
中的 resetDODOPrivatePool
方法(详见合约信息页面获取地址)来实现动态的做市调整,具体定义如下:
function resetDODOPrivatePool(
address dppAddress,
uint256[] memory paramList, //0 - newLpFeeRate, 1 - newI, 2 - newK
uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3- quoteOutAmount
uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH
uint256 minBaseReserve,
uint256 minQuoteReserve,
uint256 deadLine
) external;
参数#
- dppAddress: 私有流动池合约地址
- paramList: 按顺序传入交易费率、外部引导价格、曲线滑点系数的参数,具体如下:
- 交易费率:单位为18位,范围为[0, 1e18],其中1e18表示100%
- 外部引导价格:单位为18位 - baseToken单位 + quoteToken单位,外部引导价格是基础代币价格与计价代币价格的比率
- 滑点系统:单位为18位,范围为[0, 1e18],表示价格曲线波动程度,其中0相当于恒定卖价,1e18为类似UniSwap的AMM价格曲线
- amountList: 按照顺序传入 baseInAmount、quoteInAmount、baseOutAmount、quoteOutAmount(都使用各自的单位)。前两个表示要存入私有流动池的基础代币和计价代币的数量,需在存入前将代币授权给
DODOApprove
合约。此外,还可通过动态调整流动池的大小。 - flag: 主要用于ETH和WETH之间的兑换,具体如下:
- 0 表示基础代币和计价代币都是ERC20代币
- 1 表示传入的基础代币为ETH,合约将自动将ETH转换为WETH
- 2 表示传入的计价代币为ETH,合约将自动将ETH转换为WETH
- 3 表示提取的基础代币为WETH,合约将自动将WETH转换为ETH
- 4 表示提取的计价代币为WETH,合约将自动将WETH转换为ETH
- minBaseReserve 和 minQuoteReserve 主要用于减少交易前套利。当做市帐户发起交易并修改私有流动池参数时,可能会导致流动池价格的变化。因此,在发出交易和实际在链上执行之间的时间间隔内,机器人可能进行交易前套利。通过设置这两个参数,如果当交易在链上执行时,池中某一方的现有资金小于设定值,则合约将撤销交易以减少套利风险。
- deadLine:交易时间限制,超时后合约将撤销
DODOV2Proxy 的 ABI:
[
{
"inputs": [
{
"internalType": "address",
"name": "dppAddress",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "paramList",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "amountList",
"type": "uint256[]"
},
{
"internalType": "uint8",
"name": "flag",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "minBaseReserve",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minQuoteReserve",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadLine",
"type": "uint256"
}
],
"name": "resetDODOPrivatePool",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
]
DODO V2 单币和锚定流动池 #
DODO 单币和锚定流动池是任何人都可以参与的做市流动池,并且由于 DODO 的灵活设计,对于同一交易对,可以有不同参数的多个流动池,当用户参与做市时,根据当前流动池的比例,填充 base
和 quote
资产,并获得流动池铸造的 shares
资产量。
注意:shares
表示做市商在资产池中的份额,它是以 ERC20 格式的代币,可以自由交易。每个公共流动池对应一种类型的 shares
。
function buyShares(
address to
) external returns (uint256 shares, uint256 baseInput, uint256 quoteInput)
此函数允许将流动性注入到流动池中,并要求做市商构建一个具有两个操作的交易,第一个操作是按照流动池当前的基础代币和计价代币的比例将代币存入流动池合约,第二个操作是将接收 shares
的地址作为参数触发 buyShares
。在交易结束前,建议做市商对 baseInput
和 quoteInput
进行数量检查,以确保安全执行交易。
function sellShares(
uint256 shareAmount,
address to,
uint256 baseMinAmount,
uint256 quoteMinAmount,
bytes calldata data,
uint256 deadline
) external returns (uint256 baseAmount, uint256 quoteAmount)
此函数允许从流动池中提取流动性,做市商可以直接调用对应函数来执行交易,在其中传入的参数包括移除的份额数量、收到资金的地址,以及 baseMinAmount
(期望收到的基础代币最小数量)和 quoteMinAmount
(期望收到的计价代币的最小数量),用于滑点保护。data
通常设为空,如果不为空,则在执行结束时执行该函数,通过外部合约调用实现额外的功能,如 WETH 到 ETH 的转换等。deadline
为交易的最终截止时间,在有效时间之后的交易将超时,自动失败以保证交易的安全执行。
DODO V1 单币市场做市 #
DODOV1 使用外部预言机价格指引进行市场做市,因此支持单币提供流动性,涉及以下功能:
function depositBaseTo(address to, uint256 amount) external returns (uint256);
function depositQuoteTo(address to, uint256 amount) external returns (uint256);
这两个函数允许将单方向的流动性注入到流动池中,要求做市商构建一个具有两个动作的交易,第一个是将注入的代币授权给流动池,第二个是触发 depositBaseTo
或 depositQuoteTo
。
function withdrawBase(uint256 amount) external returns (uint256);
function withdrawQuote(uint256 amount) external returns (uint256);
这两个函数允许从流动池中提取单方向的流动性。
注意:当系统显著偏离平衡时,PMM将会发放充值奖励或收取提取费用,提充数量较大时。一般来说,做市商不需要关注这两个组成部分。当然,我们欢迎交易者在系统不平衡时补充资金以获取奖励,并在系统平衡时提取资金以避免被收取佣金。然而,某些 MEV 机器人可以利用此机制进行套汇攻击,从提取流动性的 LP 中获得利益,并获得罚金。因此,我们不建议您直接调用 DODO V1 合约上的提取方法。相反,您应该使用我们的 DODOV1Proxy 合约来提取流动性。
您可以在 DODOV1Proxy 上调用以下方法来提取流动性。minReceive
参数可以减轻 MEV 机器人的攻击。如果返回金额小于 minReceive
,交易将会失败。
function withdrawBase(address pool, uint256 amount, uint256 minReceive) external returns (uint256)
function withdrawQuote(address pool, uint256 amount, uint256 minReceive) external returns (uint256)
function withdrawAllBase(address pool, uint256 minReceive) external returns (uint256)
function withdrawAllQuote(address pool, uint256 minReceive) external returns (uint256)
DODOV1Proxy 合约部署地址:
网络 | 地址 |
---|---|
ETH | 0x8dD0Fea5FA2f7df535F87f312641Cc15d8B151BA |
BSC | 0x4Fc222194862081866FC636893DDeCB3E4341A10 |
Arbitrum | 0x49186E32fEd50fd6B5604A2618c7B0b03Cd41414 |
Polygon | 0x58E27C46c162F2a781d750BbE1119E1b2DfE82e0 |