1

我正在研究 UniswapV2Pair.sol https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.solmint ,我对功能和功能有一些疑问burn

我的理解:

  • 当用户存入代币对时,mint函数会铸造新的流动性代币并发送给用户
  • 当用户提取代币对时,burn函数会销毁新的流动性代币并将存入的代币对发回给用户

我很困惑:

我对burn上面提到的功能的粗体部分感到困惑。我认为mintburn功能就像镜像(相反)功能,但mint功能不包括将令牌对发送到交换合约的功能。但是,burn函数使用_safeTransfer将令牌对发送回用户。

我很困惑为什么他们设计的不对称。

4

1 回答 1

1

mint()函数根据以下差值计算铸造 LP 代币的数量

  • 基础代币的记录储备(_reserve0_reserve1
  • 以及配对合约拥有的实际基础代币余额 (balance0balance1)

所以从理论上讲,如果 Alice 只是将基础代币发送到配对合约而不调用该mint()函数,那将产生上述会计差异。Bob 将能够调用该mint()函数并为自己铸造 LP 代币,从而从 Alice 身上获利。

但这不是通常的流程。通常,流动性提供者 (Alice) 会调用路由器合约的addLiquidity()函数,该函数同时执行这两个操作:

  • 将(批准的)代币从用户转移到配对合约
  • 调用mint()配对合约上的函数,计算在此交易中创建的差异

这消除了 Bob 拦截 Alice 的铸币过程的可能性。

例如,让mint()函数本身可执行还允许任何人认领未认领的代币,这些代币被错误地发送到配对合约。


但是,如果您想将基础代币从配对合约(即burn()LP 代币)中转出,则需要在burn()函数中进行检查,这样您就不能索取超过您有资格获得的基础代币。

无论您是burn()直接调用 pair 函数还是从路由器removeLiquidity()调用(通常从 Uniswap UI 调用)。

于 2022-01-05T11:05:20.967 回答