这是取自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]它提供了更多的细节,并阐明了其背后的原因。