【问题标题】:Questions about mint, burn function in UniswapV2Pair.solUniswapV2Pair.sol中关于mint、burn功能的问题
【发布时间】:2022-01-05 10:13:51
【问题描述】:

我正在研究 UniswapV2Pair.sol https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol,我对 mintburn 函数有一些疑问。

我的理解:

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

我的困惑:

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

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

【问题讨论】:

    标签: blockchain solidity web3 uniswap


    【解决方案1】:

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

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

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

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

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

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

    并且让mint() 函数本身可执行还允许任何人索取例如错误地发送到配对合约的无人认领的代币。


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

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

    【讨论】:

    • 知道了!谢谢!
    猜你喜欢
    • 2011-06-05
    • 2022-08-05
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2015-10-09
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多