关于在合约中判断加流动性/移除流动性

functionaddLiquidity(addresstokenA,addresstokenB,uintamountADesired,uintamountBDesired,uintamountAMin,uintamountBMin,addressto,uintde

写合约时,总有项目方提出加流动性/移除流动方面的需求,但是在合约里面判断比较麻烦,在实践中总结了一下:

function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { 。。。。。 TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); 。。。。。 } 根据路由合约的加池子的实现,会先加tokenA,如果tokenA是交易对的另外一种代币,在自己的代币tokenB 合约的transferFrom中,tokenA已经完成转账到pair,这是时候判断eserves 必然和balanceOf(tokenA)不同,如果balanceOf 大于eserves,那么就是加池子。 这正是利用了的上面代码的两个 TransferHelper.safeTransferFrom 的先后关系。

function burn(address to) external lock returns (uint amount0, uint amount1) { 。。。。。 _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); 。。。。。 }

而移除池子就是根据pair合约的token0 和 token1 的大小关系来判断,必须对方代币为token0, 这样就会从池子中先转走token0, 同样在自己的合约的transferFrom中判断reserves 和balanceOf(token0)的大小,如果前者大于后者,则表示是在移除流动性。

总结一下,如果路由合约添加流动性,增加一个tokenA和tokenB的大小,先转地址小的那个,跟pair合约的处理一致,那么就可以轻松的判断交易的类型了:转账,买入,卖出,加流动性,移除流动性,就是在部署合约时,在合约的构造函数中,加个 require(address(this) > otherToken, "需要保证合约地址大于otherToken"), 那么不成功的话,从新换个地址部署,直到创建的合约地址满足要求。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
张文阁
张文阁
江湖只有他的大名,没有他的介绍。