使用 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)
**
您需要确定以下几点:
您的 Metamask 扩展正在连接到您的安全帽本地主机网络。
当你在安装了 Metamask 扩展的浏览器中 运行 你的 React 应用程序时,确保你的 Metamask 连接到你的 hardhat localhost 网络(默认情况下,它是 localhost:8545 ).如果 Metamask 连接到不同的网络,您将收到该错误。
(注意:因为 Metamask 扩展默认隐藏测试网络,您需要让它显示测试网络,以便您可以看到列出的 hardhat localhost 网络。)
使用正确的合约地址。
当您启动 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],您将收到错误消息。
我正在设置与 ether.js 的反应,智能合约是在本地主机网络上使用 hardhat 部署的。 React 应用程序使用
连接到 metasmaskconst 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) **
您需要确定以下几点:
您的 Metamask 扩展正在连接到您的安全帽本地主机网络。
当你在安装了 Metamask 扩展的浏览器中 运行 你的 React 应用程序时,确保你的 Metamask 连接到你的 hardhat localhost 网络(默认情况下,它是 localhost:8545 ).如果 Metamask 连接到不同的网络,您将收到该错误。
(注意:因为 Metamask 扩展默认隐藏测试网络,您需要让它显示测试网络,以便您可以看到列出的 hardhat localhost 网络。)使用正确的合约地址。
当您启动 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],您将收到错误消息。