首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >授权人批准ERC20合同

授权人批准ERC20合同
EN

Ethereum用户
提问于 2022-02-02 10:54:22
回答 1查看 570关注 0票数 1

我试图从另一个ERC20合同的合同中调用审批:

代表呼吁:

代码语言:javascript
复制
// 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合同:

代码语言:javascript
复制
// 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

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-02-02 11:21:40

当代表运行MyERC20 20删除时,它在代表的上下文中执行MyERC20 20‘S代码。因此,所有被更改的变量,以及其他所有的变量,都是仅在委托上完成的。这就是为什么您在代理而不是MyERC20上看到事务的原因。你不能用委派来改变另一个合同的状态。

如果您要检查success_approve是否为真,您可能会发现调用实际上失败了(因为您没有执行.approve命令所需的代理变量)。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/120551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档