Uniswap分叉移除流动性后储备金残留代币,如何清空全部储备?
Uniswap分叉项目储备金残币清除解决方案
残币产生原因
Uniswap V2的核心计算逻辑采用整数截断规则,销毁LP时按LP持有比例计算可提取资产时,向下取整会遗留极小额的资产在储备金中;此外首次添加流动性时默认销毁的1000 wei LP锁死在零地址,也会导致对应比例的资产永远无法通过常规移除流动性操作提取。
可行解决方案
- 方案1:新增残币紧急提取函数(推荐)
在配对合约或路由合约中新增仅所有者可调用的残币提取接口,添加严格的阈值校验避免被滥用,参考代码如下:
function rescueDust(address token, address recipient) external onlyOwner { uint256 currentBalance = IERC20(token).balanceOf(address(this)); // 校验规则可按需调整:要么总LP供应量为0,要么余额低于1000 wei的残币阈值 require(IUniswapV2Pair(address(this)).totalSupply() == 0 || currentBalance < 1000, "Cannot withdraw non-dust assets"); TransferHelper.safeTransfer(token, recipient, currentBalance); }
注意:该函数必须添加严格的权限控制和余额校验,上线前需完成安全审计,避免被恶意调用抽走正常储备金。
方案2:修改销毁逻辑从根源避免残币
修改配对合约的burn方法逻辑,当检测到本次销毁后LP总供应量归0时,直接将合约内全部代币余额分配给提取者,而非按比例计算,从根源避免截断产生残币。方案3:无合约修改的临时解决方案
如果合约已上线无法修改,可先按照当前储备金比例添加和残币量级匹配的极小额流动性,再一次性销毁所有持有的LP,操作时将滑点阈值调到最低即可,不会产生大额额外损失。
注意:任何涉及核心资金逻辑的修改都需要完成全覆盖的单元测试,避免引入整数溢出、权限泄露等致命安全问题。
内容的提问来源于stack exchange,提问作者Maximilian O
相关产品推荐
相关产品推荐

