在OpenZeppelin对ERC20的transferFrom的实现中,为什么在检查提款者津贴之前调用_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仍然正确工作吗?

我发现关于OpenZeppelin GitHub问题的相同主题的讨论,代码的作者确认顺序无关在ERC-20的背景下。

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

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

然而,对于那些打算用自己的实现重写_transfer或_approve的用户来说,这是非常相关的:我们应该清楚这些事情发生的顺序。

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


所以假设你没有在覆盖_transfer()_approve()内部函数中使用自定义逻辑,如果你切换顺序,transferFrom()仍然会正确工作。

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

相关内容

  • 没有找到相关文章

最新更新