【问题标题】:ERC777 Deployment with Transaction Reverted ErrorERC777 部署与事务恢复错误
【发布时间】:2022-08-15 15:36:53
【问题描述】:

我正在努力在 typescript 中使用安全帽、ethers 部署 ERC777 令牌。我的部署脚本如下

import { MarketSvc, ProductSvc } from \'../libs/deployment-service/src\';
import hre from \'hardhat\';
async function main() {
    const marketAddress = await MarketSvc.deployContract(contractType);
    const productAddress =  await ProductSvc.deployContract(contractType, marketAddress);
}

我的执行功能看起来像这样

async deployContract(
    contractType: ContractType,
    ...args: any[]
): Promise<string> {
const contractFactory = await hre.ethers.getContractFactory(contractType);
    const contract =
  args === undefined
            ? await contractFactory.deploy()
            : await contractFactory.deploy(...args);
    await contract.deployed();
    console.log(contractType + \' Contract deployed to:\', contract.address);
    return contract.address;
}

第一次部署成功。第二次部署失败并出现错误

MarketContract Contract deployed to: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
ProviderError: Error: Transaction reverted: function call to a non-contract account       
at HttpProvider.request (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\core\\providers\\http.ts:49:19)
at GanacheGasMultiplierProvider.request (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\core\\providers\\gas-providers.ts:312:34)
at processTicksAndRejections (node:internal/process/task_queues:96:5)

在 ERC777 合约中,它在以下方法中失败 (@openzeppelin\\contracts\\token\\ERC777\\ERC777.sol:75)

  /**
 * @dev `defaultOperators` may be an empty array.
 */
constructor(
    string memory name_,
    string memory symbol_,
    address[] memory defaultOperators_
) {
    _name = name_;
    _symbol = symbol_;

    _defaultOperatorsArray = defaultOperators_;
    for (uint256 i = 0; i < defaultOperators_.length; i++) {
        _defaultOperators[defaultOperators_[i]] = true;
    }

    console.log(\"added operators\");

    // register interfaces - It is failing here
    _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256(\"ERC777Token\"), address(this));
    console.log(\"registered ERC777\");
    _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256(\"ERC20Token\"), address(this));
}

我的合同的构造函数是这个

    constructor(address defaultOperator)
    ERC777(\"SOMEtoken\", \"TKN\", _defaultOps(defaultOperator)) {
        console.log(defaultOperator);
        _mint(_msgSender(), 1000000, \"Initial Mint\", \"defaultOps\");
}

我的可靠性日志是

Error: Transaction reverted: function call to a non-contract account
  at GParticle.constructor (@openzeppelin/contracts/token/ERC777/ERC777.sol:75)       
  at EthModule._estimateGasAction (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\hardhat-network\\provider\\modules\\eth.ts:425:7)
  at HardhatNetworkProvider._sendWithLogging (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\hardhat-network\\provider\\provider.ts:138:22)
  at HardhatNetworkProvider.request (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\hardhat-network\\provider\\provider.ts:115:18)
  at JsonRpcHandler._handleRequest (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\hardhat-network\\jsonrpc\\handler.ts:188:20)
  at JsonRpcHandler._handleSingleRequest (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\hardhat-network\\jsonrpc\\handler.ts:167:17)
  at Server.JsonRpcHandler.handleHttp (C:\\src\\trae\\gbc\\exchange\\exchange_ui\\node_modules\\hardhat\\src\\internal\\hardhat-network\\jsonrpc\\handler.ts:52:21)

我给它的运营商地址,被大胆地部署并且是一份合同。但所以我对 777 合同中可能发生的具体情况感到有些困惑。我有一个完美部署的 ERC20 和 1155……

如果有人有任何见解,所有信息都将受到赞赏。

    标签: solidity hardhat openzeppelin erc777


    【解决方案1】:

    问题的根源在于,如果您在本地网络上工作,例如安全帽……您将不得不部署自己的 ERC1820_REGISTRY,因为它不存在。

    openzeppelin 有一些实用程序,您可以使用它来非常简单地启用它。

    const { singletons } = require('@openzeppelin/test-helpers');
    require('@openzeppelin/test-helpers/configure')
    
    async function main() {
        const signers = await hre.ethers.getSigners();
        const address = signers[0].address;
        const erc1820 = await singletons.ERC1820Registry(address);
    
        ... deploy your ERC777
    }
    

    【讨论】:

      【解决方案2】:

      我实现了 ERC1820 和 ERC777 的完整部署,我的代码检查它是否不是,部署它,然后部署 ERC777 并注册接收者, 它是用安全帽实现的,我把指南放在 readme.md 中

      这是我的回购:

      https://github.com/EhsanParsania/ERC777

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 2017-11-21
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 2015-02-08
        • 2012-09-05
        • 2018-08-29
        相关资源
        最近更新 更多