0

我在本地使用安全帽并启动并运行了一个反应前端,但我无法毫无错误地调用这些方法。

我已经尝试过 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    

注意:在 deploy.js 文件中,我做了一个

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",
        settings: {
          optimizer: {
            enabled: true,
            runs: 1000
          }
        }
      },
    ],
  },
  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)

我已经在协议中尝试了许多合同,并且每个合同都相同

4

0 回答 0