Solidity
如何使用 ethers.js 從合約中讀取公共變數
我正在嘗試使用 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()