我试图从另一个ERC20合同的合同中调用审批:
代表呼吁:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Delegate {
address public constant f24 = 0x70CcB2c7E3809f1e91B8273beC4c8186b4F897a4;
function delegate(address account, uint256 price) external {
(bool success_approve,) = f24.delegatecall(abi.encodeWithSignature('approve(address,uint256)',account,price));
}
}ERC20合同:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
contract MyERC20 is ERC20, ERC20Permit, ERC20Votes, ERC20Pausable, ERC20Burnable, AccessControl {
using SafeMath for uint256;
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
mapping(uint256 => uint256) public claim;
constructor() ERC20("MyERC", "MRC") ERC20Permit("MyERC") {
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setupRole(OPERATOR_ROLE, msg.sender);
}
function decimals() public view virtual override returns (uint8) {
return 2;
}
function _mint(address account, uint256 amount) internal virtual override(ERC20, ERC20Votes) {
super._mint(account, amount);
}
function _burn(address account, uint256 amount) internal virtual override(ERC20, ERC20Votes) {
super._burn(account, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual override(ERC20, ERC20Pausable) {
super._beforeTokenTransfer(from, to, amount);
}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual override(ERC20, ERC20Votes) {
super._afterTokenTransfer(from, to, amount);
}
}我调用函数delegate,事务成功结束。
https://testnet.arbiscan.io/tx/0xd048a1e312c240696bf58c22c89267bd6afebaf38e11d6e37d2c719004e4e115
但是,检查ERC20合同0x70CcB2c7E3809f1e91B8273beC4c8186b4F897a4 (仲裁机Rinkeby)没有事务跟踪。
有谁知道出了什么问题吗?
同时,我在Ethereum L1上触发了同样的事务。内部事务,delegatecall用于approve是成功的,但是,状态似乎没有改变,允许仍然是0(0):
https://rinkeby.etherscan.io/tx/0xde431622bd04556dc4c9ee0eb1f76c367d09194ce6b2b1febd7b35ad8990ae4d
发布于 2022-02-02 11:21:40
当代表运行MyERC20 20删除时,它在代表的上下文中执行MyERC20 20‘S代码。因此,所有被更改的变量,以及其他所有的变量,都是仅在委托上完成的。这就是为什么您在代理而不是MyERC20上看到事务的原因。你不能用委派来改变另一个合同的状态。
如果您要检查success_approve是否为真,您可能会发现调用实际上失败了(因为您没有执行.approve命令所需的代理变量)。
https://ethereum.stackexchange.com/questions/120551
复制相似问题