1

这取自 OpenZeppelin 的 ERC20transferFrom实现:

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

在检查提款人( )津贴之前是否有理由_transfer调用?msg.sender

如果先transferFrom进行余量require检查,是否仍能正常工作?

4

2 回答 2

1

我在 OpenZeppelin GitHub 问题上发现了关于同一主题的讨论,并且代码的作者确认该顺序在 ERC-20 的上下文中无关紧要。

在 ERC20 的情况下,订单无关紧要,因为 _transfer 和 _approve 是独立的,从不调用任何其他合约:它们是原子执行的。

此外,他还表示,当有人想要覆盖这些功能时,保持订单稳定很重要。

但是,这对于打算用自己的实现覆盖 _transfer 或 _approve 的用户非常重要:我们应该清楚这些事情发生的顺序。

来源:https ://github.com/OpenZeppelin/openzeppelin-contracts/issues/2030#issuecomment-568487500


因此,假设您没有在覆盖_transfer()_approve()内部函数中使用自定义逻辑,transferFrom()如果您切换顺序,它仍然可以正常工作。

于 2021-03-05T00:17:35.867 回答
0

我实际上在寻找同样的东西,然后我发现了这个讨论 [https://forum.openzeppelin.com/t/in-erc20-tranferfrom-why-transfer-before-checking-allowance/5312/3] 它提供了更多细节并阐明其背后的原因。

于 2021-12-22T07:19:11.120 回答