“交易已被 EVM 拒绝:” - 为什么会发生错误?

问题描述 投票:0回答:1

问题的本质

Meta mask 中会打开一个关于支付 Gas 费用的窗口。我可以点击“继续”,但我等不及一次交易的顺利完成 - 总是出错

发生{“blockHash”:“0x33e1cd0a7c540d9cb08319bfdeae2ab87bf7a81f1daec361298f9735260c4b93”, "区块编号":"9968588", "累计使用气体":"1339077", "有效汽油价格":"2500000010", “来自”:“0x****************”, "gasUsed":"21069", “日志”[], "logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000",

“状态”:“0”, “至”:“0x4f37382283719cf4151e27412c60472303fd158f”, “交易哈希”:“0x375c55a6e8f29eddd454e3a7bbf0af4245d3c44cfccea87bade47441c1941857”, "transactionIndex":"1","type":"2"}"


我正在尝试使用 Next.js 为智能合约编写一个接口,如下所示:

contract CampaignFactory {
    address payable[] public deployedCampaigns;

    function createCampaign(uint minimum) public {
        address newCampaign = address(new Campaign(minimum, msg.sender));
        deployedCampaigns.push(payable(newCampaign));
    }

    function CreateNewIdenticalCampaign() public {
        address newCampaign = address(new Campaign(100, msg.sender));
        deployedCampaigns.push(payable(newCampaign));
    }

    function getDeployedCampaigns()
        public
        view
        returns (address payable[] memory)
    {
        return deployedCampaigns;
    }
}

get (getDeployedCampaigns) 方法在 Remix Ethereum IDE 和我的应用程序中运行良好。

但是post方法有一些麻烦。我可以立即充满信心地说,post 方法没有被破坏,因为其中的所有内容都可以完美运行,但仅限于 Remix。我假设我的应用程序中的代码在 **.js 文件中写得不正确:

const accounts = await web3.eth.getAccounts();
      const minimumWei = web3.utils.toWei(
        this.state.minimumContribution,
        "ether"
      );

      const gas = await factory.methods
        .createCampaign(minimumWei)
        .estimateGas({ from: accounts[0] });

      await factory.methods
        .createCampaign(minimumWei)
        .send({
          from: accounts[0],
          gas: 10000000, //web3.utils.toHex(gas),
          gasPrice: web3.utils.toWei("0.0001", "gwei"),
        })
        .on("transactionHash", function (hash) {
          console.log("Transaction send, хэш: " + hash);
        })
        .on("receipt", function (receipt) {
          console.log("Done, блок: " + receipt.blockNumber);
        })
        .on("error", function (error) {
          console.error("Error: " + error.message);
        });

我尝试不指定天然气、天然气价格属性,但没有任何帮助。

next.js solidity smartcontracts metamask
1个回答
0
投票

太好了!我找到了问题的答案,事实证明,在 2023 年,您需要在 web3 中进行与 2019 年不同的编程 - 您还需要发送方法 ABI,这是代码的工作版本:

const accounts = await web3.eth.getAccounts();
      const encode = await factory.methods.createCampaign(100).encodeABI();
      await factory.methods
        //.CreateNewIdenticalCampaign()
        .createCampaign(this.state.minimumContribution)
        .send({
          from: accounts[0],
          data: encode
        });
© www.soinside.com 2019 - 2024. All rights reserved.