如何解决React,Hardhat 前端智能合约方法调用,怎么做?
我在本地使用安全帽并启动并运行了 React 前端,但我无法毫无错误地调用这些方法。
ethers.js 和 web3 都试过了。
这是我的代码和尝试。如果您发现我做错了什么,请告诉我。
我正在尝试通过 web3 与部署在本地安全帽环境中的合约进行交互
我无法从合同中取回数据,这是信息
我有:
var list = await contract.methods.getList();
console.log("list ",list );
这让我着迷
list {arguments: Array(0),call: ƒ,send: ƒ,encodeABI: ƒ,estimateGas: ƒ, …}
当我这样做
var list = await contract.methods.getList().call();
console.log("list ",list );
我在浏览器中收到此错误:
返回的值无效,是否耗尽了 Gas?如果您没有为从中检索数据的合约使用正确的 ABI、从不存在的块号请求数据或查询未完全同步的节点,您也可能会看到此错误。
我愿意:
在控制台中设置:
npx hardhat node
>Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
>Accounts
>========
>...
npx hardhat compile
> nothing to compile
npx hardhat run scripts/deploy.js --network hardhat
const list = await contract.getList();
console.log("list",list ); // correctly outputs ["string","string"]
方法:
mapping(uint256 => address) internal list;
uint256 internal listCount;
function getList() public override view returns (address[] memory) {
address[] memory assets = new address[](listCount);
for (uint256 i = 0; i < listCount; i++) {
assets[i] = list[i];
}
return assets;
}
在响应 App.js 中:
import Contract_from './data/abi/Contract_.json'; // Contract_ is a placer
var contract = new web3.eth.Contract(Contract_,address_given_on_deploy);
var contractAddress = await contract .options.address; // correctly outputs
var list= await contract.methods.getList().call();
console.log("list",list);
出于任何原因,可能是问题所在,这是我的配置:
require("@nomiclabs/hardhat-waffle");
// openzeppelin adds
require("@nomiclabs/hardhat-ethers");
require('@openzeppelin/hardhat-upgrades');
//abi
require('hardhat-abi-exporter');
// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts","Prints the list of accounts",async () => {
const accounts = await ethers.getSigners();
for (const account of accounts) {
console.log(account.address);
}
});
// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more
/**
* @type import('hardhat/config').HardhatUserConfig
*/
module.exports = {
networks: {
hardhat: {
gas: 12000000,blockGasLimit: 0x1fffffffffffff,allowUnlimitedContractSize: true,timeout: 1800000,chainId: 1337
}
},solidity: {
compilers: [
{
version: "0.8.0",settings: {
optimizer: {
enabled: true,runs: 1000
}
}
},{
version: "0.8.2",],},abiExporter: {
path: './frontend/src/data/abi',clear: true,flat: true,only: [],spacing: 2
}
}
__
我想也许我会尝试 ethers.js,因为那是我测试的内容,但同样的问题。
无论出于何种原因,我都可以“获取”合约,打印属于它们的方法,但我实际上无法调用这些方法。
这是我的 ethers.js 简短说明:
provider = new ethers.providers.Web3Provider(window.ethereum);
if(provider != null){
const _contract = new ethers.Contract(address,_Contract,provider);
var list= await _contract.getList().call();
console.log("list",list);
}
我从中得到的错误是:
Error: call revert exception (method="getList()",errorArgs=null,errorName=null,errorSignature=null,reason=null,code=CALL_EXCEPTION,version=abi/5.4.0)
我在协议中尝试了很多合同,每个合同都是一样的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。