在OpenZeppelin的Transfer From实现中,为什么在检查取款者津贴之前调用_Transfer() [英] In OpenZeppelin's implementation of ERC20's transferFrom, why is _transfer() called before withdrawer allowance is checked

查看:15
本文介绍了在OpenZeppelin的Transfer From实现中,为什么在检查取款者津贴之前调用_Transfer()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这取自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;
    }

在检查取款人(msg.sender)津贴之前调用_transfer有什么原因吗?

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

推荐答案

我在OpenZeppelinGitHub Issues上找到了关于同一主题的讨论,代码的作者确认该顺序与eRC-20的上下文无关

对于ERC20,顺序是无关的,因为_Transfer和_Approve是独立的,不会调用任何其他合同:它们是自动执行的。

此外,他还指出,在有人想要覆盖函数时,保持顺序稳定很重要。

但是,这与打算使用自己的实现覆盖_Transfer或_Approve的用户非常相关:我们应该清楚这些操作的发生顺序。

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


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

这篇关于在OpenZeppelin的Transfer From实现中,为什么在检查取款者津贴之前调用_Transfer()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆