Solidity

如何使用 ethers.js 從合約中讀取公共變數

  • May 24, 2021

我正在嘗試使用 ethers.js 從鏈上的合約中讀取公共變數。

呼叫方法有效,但我無法讀取公共屬性(沒有 getter)。

這些方法的工作原理如下:

const ethers = require('ethers');
const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed1.binance.org:443');

const contract = new ethers.Contract(address, [
   'function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256)',
], provider);

let works = await contract.getMultiplier(5, 10);

但是,如果我嘗試訪問公共財產,它就不起作用。事實上,我收到 ABI 錯誤。

const contract = new ethers.Contract(address, [
   'uint256 public totalAllocPoint',
   'PoolInfo[] public poolInfo'
], provider);

錯誤:不支持的片段(argument=“value”,value=“uint256 public totalAllocPoint”,code=INVALID_ARGUMENT,version=abi/5.2.0)

poolInfo甚至不同,因為它需要一個參數。

我如何閱讀totalAllocPoint和閱讀poolInfo契約?


不應該是這樣的:

let x = await contract.totalAllocPoint;
let y = await contract.poolInfo(2);

文件中,不幸的是它只顯示瞭如何訪問方法

實際上,在solidity docs中,它指出對於每個公共成員變數,都會自動定義一個getter。簡而言之,您將能夠像這樣獲得基本類型的公共成員:let x = await contract.totalAllocPoint();您在這裡缺少括號。

雖然您可以像這樣得到數組:let y = await contract.poolInfo(2);當然,在這種情況下,如果數組長度大於 3。

對於映射類型

mapping (address => mapping(uint256 => Order)) public orderByAssetId;
await contract.orderByAssetId(address, id);

為了更詳細地解釋它,如果你查看編譯你的solidity合約生成的ABI,你應該能夠看到這樣的:

Solidity 中的定義合約

contract MasterChef {
...
 uint256 public totalAllocPoint = 0;
...
}

等於 ABI

 {
   "inputs": [],
   "name": "totalAllocPoint",
   "outputs": [
     {
       "internalType": "uint256",
       "name": "",
       "type": "uint256"
     }
   ],
   "stateMutability": "view",
   "type": "function"
 },

繼續編碼!


使用 ethers.js 的人類可讀 ABI

const contract = new ethers.Contract(contractAddress, [
  'function totalAllocPoint() public view returns (uint256)'
], provider)

await contract.totalAllocPoint()

引用自:https://ethereum.stackexchange.com/questions/99565