Solidity

用乙太幣呼叫合約只返回十六進制值

  • September 28, 2022

我正在嘗試呼叫契約的功能。我正在託管一個帶有安全帽的本地節點,顯然我將契約部署到該節點。連接 MetaMask 和所有工作都沒有問題。在控制台中,我還可以看到,合約在節點上被呼叫。在文件中它說返回的值應該是實際的整數。但我只得到以下輸出:

對象{_hex:“0x042deee8d42de3f0”,_isBigNumber:真}

合約呼叫如下所示:

const contractAddress = "address",
const abi = ["function getBalance() public view returns (uint256)"]

const provider = new ethers.providers.Web3Provider(window.ethereum)
await provider.send("eth_requestAccounts", [])

let contract = new ethers.Contract(contractAddress, abi, provider)

const balance = await contract.getBalance()
console.log("Balance: ", balance)

如何獲得實際的整數值?

這些ethers.js方法返回一個ethers.BigNumber實例而不是原生 JavaScript 數字,因為原生 JavaScript 數字不支持我們在加密中使用的大數字,並且會默默溢出產生災難性錯誤的數字。

您可以將balance變數作為字元串獲取balance.toString()。相反,您可能想要一個人類可讀的 ETH 數字(而不是您剛剛獲得的 wei 數字,即 10 的 18 次方),在這種情況下,您可以執行類似的操作 ethers.utils.formatUnits(balance, 18)

你可以用 把它變成一個 JavaScript 數字balance.toNumber(),但你不應該這樣做,除非你確定它不會溢出,你可能不會。

要對這些數字做任何其他事情,請閱讀ethers.BigNumber文件。您應該閱讀全文,因為粗心的人會遇到各種陷阱。另請注意,它與更常見的庫和替代庫ethers.BigNumber略有不同。BigNumber.js``BN.js

https://docs.ethers.io/v5/api/utils/bignumber/

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