首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我使用ethers.js部署契约,但返回的错误: uncaught (承诺中)错误:未知事务覆盖0

我使用ethers.js部署契约,但返回的错误: uncaught (承诺中)错误:未知事务覆盖0
EN

Stack Overflow用户
提问于 2022-08-11 01:31:42
回答 1查看 285关注 0票数 0

我使用ethers.js部署契约,但返回了一个错误:uncaught (承诺)错误:未知事务覆盖0

在ContractFactory。getDeployTransaction (index.ts:1196:1)

ContractFactory.< anonymous> (index.ts:1246:1)

在发电机。下一次()

在履行(index.ts:2:1)

相反,可以使用web3.js成功地部署相同的契约,但部署后三个参数(宫缩名称、压缩符号和压缩符号)会被混淆。

使用ethers.js部署契约的代码如下:

代码语言:javascript
复制
...
    window.ethereum.request({ method: 'eth_requestAccounts' });
    const provider = new ethers.providers.Web3Provider(window.ethereum);

    const signer = provider.getSigner()
    console.log("Account:", await signer.getAddress());
    
    const factory = new ethers.ContractFactory( bodyJSON2.abi, bodyJSON2.bytecode, signer );
    console.log("factory.signer:", factory.signer);
    await factory.deploy([contractName, contractSymbol, contractURI])
    .then(async function(contract){ 
      console.log("for debug. Contract Path: ", contract.address); 
    });                

合同代码如下:

代码语言:javascript
复制
function initialize(string memory name, string memory symbol, string memory url
    ) public virtual initializer {
        __BXPP_init(name, symbol, url);
    }
    using CountersUpgradeable for CountersUpgradeable.Counter;
    CountersUpgradeable.Counter private _tokenIds;

    string private _baseTokenURI;

...

ethers.js中的相关错误代码如下:

代码语言:javascript
复制
getDeployTransaction(...args: Array<any>): TransactionRequest {
    let tx: TransactionRequest = { };

    // If we have 1 additional argument, we allow transaction overrides
    if (args.length === this.interface.deploy.inputs.length + 1 && typeof(args[args.length - 1]) === "object") {
        tx = shallowCopy(args.pop());
        for (const key in tx) {
            if (!allowedTransactionKeys[key]) {
                throw new Error("unknown transaction override " + key);
            }
        }
    }

使用web3.js部署契约的代码如下:

代码语言:javascript
复制
    const web3 = new Web3(window.ethereum);
    const BXPP = new web3.eth.Contract(bodyJSON2.abi);
    await BXPP.deploy({
      'data': bodyJSON2.bytecode,
      'arguments': [contractName, contractSymbol, contractURI]
    })         
    .send({
      'from': address,
      // gas: ,
      // gasPrice: '3000000'
    }, function(error, transactionHash){ console.log("error/transactionHash: ", error, transactionHash) })
    .on('error', function(error){ console.log("error: ", error) })
    .on('transactionHash', function(transactionHash){ console.log("transactionHash: ", transactionHash) })
    .on('receipt', function(receipt){ console.log(receipt.contractAddress) 
    })
    .on('confirmation', function(confirmationNumber, receipt){ console.log("confirmationNumber:", confirmationNumber) })
    .then(async function(newContractInstance){
        console.log("for debug. ContractID: ", newContractInstance.options.address);                     
    });  

我在谷歌搜索了将近一个星期,但没有找到答案。有人和我有同样的问题吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-08-13 01:58:38

这个问题已经解决了。有两点:

  1. 使用醚(我的机器中的版本)来部署契约,并在不使用数组的情况下传递参数。像这样:

代码语言:javascript
复制
 await factory.deploy(contractName, contractSymbol, contractURI)

不是这样的:

代码语言:javascript
复制
await factory.deploy([contractName, contractSymbol, contractURI])

  1. I使用了一个可初始化的契约(使用初始化器初始化)并将其更改为正常契约(使用构造函数初始化)。像这样:

代码语言:javascript
复制
constructor(string memory name, string memory symbol, string memory url
    ) {
        __ContractTemplate_init(name, symbol, url);
    }

不是这样的:

代码语言:javascript
复制
function initialize(string memory name, string memory symbol, string memory url
    ) public virtual initializer {
        __ContractTemplate_init(name, symbol, url);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73314354

复制
相关文章

相似问题

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