如果只调用transferFrom,则会出现不足允许错误。但是,如果使用this.transferFrom关键字调用this,则它将无错误地传输(使用许可方法)。
这有什么区别?
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
contract MyContract is ERC20, ERC20Permit {
uint public INITIAL_SUPPLY = 1000000000000000000000000;
event wPermit(address indexed owner, address indexed spender, uint256 amount);
constructor() ERC20("YYYYK", "YYYK") ERC20Permit("YYYYK_TEST") {
_mint(msg.sender, INITIAL_SUPPLY);
}
function transferWithPermit_success
(
uint256 _amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
require(_amount > 0, "Cannot send 0");
permit(msg.sender, address(this), _amount, deadline, v, r, s);
this.transferFrom(msg.sender, address(this), _amount);
}
function transferWithPermit_fail
(
uint256 _amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
require(_amount > 0, "Cannot send 0");
permit(msg.sender, address(this), _amount, deadline, v, r, s);
transferFrom(msg.sender, address(this), _amount);
}
}发布于 2023-04-04 18:01:04
这有点难以解释,让我试试:当使用此函数时:
permit(msg.sender, address(this), _amount, deadline, v, r, s);您正在授予对合同地址使用调用方令牌的权限。换句话说,契约实例"this“是获得执行事务权限的实例。
transferFrom()函数的ERC20库如下:
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}如果你观察到这些线条:
address spender = _msgSender();
_spendAllowance(from, spender, amount);在这里,我们可以看到该函数使用"spender“的权限来执行事务。而花钱的人是"msg.sender“。
因此,如果我们直接调用transferFrom(),函数将在msg.sender中查找权限,在本例中,该权限是函数的调用者。并且这个用户没有许可,因为它被授予了合同,而不是调用者。
另一方面,如果调用this.transferFrom(),则表示调用函数的是"this",即当前契约实例。而且合同也有许可职能的许可。
这就是为什么this.transferFrom()可以工作,但是transferFrom()不能工作。
我希望这是清楚的,如果没有,请不要犹豫,要求澄清。
发布于 2023-04-04 18:01:40
区别在于当您使用this.transferFrom()时,契约对自身进行“外部”调用,从而将msg.sender修改为自身。当您调用transferfrom()时,原始msg.sender在进行内部调用时被保留下来。
https://ethereum.stackexchange.com/questions/148502
复制相似问题