使用 ether.js 调用还原异常

call revert exception in using ether.js

我正在设置与 ether.js 的反应,智能合约是在本地主机网络上使用 hardhat 部署的。 React 应用程序使用

连接到 metasmask
const provider = new ethers.providers.Web3Provider(window.ethereum);

合同写在下面

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "hardhat/console.sol";

contract Greeter {
    string private greeting;

    constructor(string memory _greeting) {
        console.log("Deploying a Greeter with greeting:", _greeting);
        greeting = _greeting;
    }

    function greet() public view returns (string memory) {
        return greeting;
    }

    function setGreeting(string memory _greeting) public {
        console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
        greeting = _greeting;
    }
}

我使用 npx hardhat 部署了这个合约 运行 script.js.In 我正在使用

获取合约对象的反应代码
const erc20=new ethers.Contract(address,obj.abi,signer);

并且在 useEffect 中我试图调用 erc20.greet() 这在控制台中给出了错误。 ** (in promise) 错误:调用恢复异常 (method="greet()", errorArgs=null, errorName=null, errorSignature=null, reason=null, code=CALL_EXCEPTION, version=abi/5。 5.0) **

您需要确定以下几点:

  1. 您的 Metamask 扩展正在连接到您的安全帽本地主机网络。
    当你在安装了 Metamask 扩展的浏览器中 运行 你的 React 应用程序时,确保你的 Metamask 连接到你的 hardhat localhost 网络(默认情况下,它是 localhost:8545 ).如果 Metamask 连接到不同的网络,您将收到该错误。
    (注意:因为 Metamask 扩展默认隐藏测试网络,您需要让它显示测试网络,以便您可以看到列出的 hardhat localhost 网络。)

  2. 使用正确的合约地址。
    当您启动 hardhat 本地网络时,hardhat 将 return 像这样的帐户列表:

    WARNING: These accounts, and their private keys, are publicly known. Any funds sent to them on Mainnet or any other live network WILL BE LOST.
    
    Account #0: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 (10000 ETH)
    Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
    
    Account #1: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 (10000 ETH)
    Private Key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
    ...
    

    当您在本地主机网络上使用 hardhat 部署该智能合约时,hardhat 将 return 如下所示:

    [contract-name] deployed to: [contract-address]
    

    确保使用 [contract-address] 作为此处 address 参数的值:

    const erc20=new ethers.Contract(address,obj.abi,signer);
    

    一个[contract-address]和一个账号看起来很像,但它们代表的是两个不同的东西。如果您使用帐户而不是 [contract-address],您将收到错误消息。