gpt4 book ai didi

javascript - 如何将 RSK 代币余额转换为 Javascript 数字?

转载 作者:行者123 更新时间:2023-12-04 02:25:43 25 4
gpt4 key购买 nike

我想从代币智能合约中获取余额(代币数量)。
我正在使用 web3.js 与契约(Contract)进行交互,并且能够获得返回值。
但是,有了这个值,如果我这样做 .toString() ,我看到它具有正确的值。
但是,如果我这样做 .toNumber() ,它给了我一个错误:Error: Number can only safely store up to 53 bits为什么会这样?以及如何从智能合约中获取特定账户的余额,作为数字 (不是字符串)?

最佳答案

智能合约可以支持非常大的数字(在 Solidity 中高达 uint256)。然而内置的Number Javascript 的类型不能表示那么大的数字,因此在 web3.js 中,任何数值都包含在 BN 中(大数字)。您可以在 web3.utils.BN 中找到该类(class).
这就是为什么当您收到余额查询错误时,
因为余额是 uint256 , 通常用于表示 18小数位。我们可以只使用 web3.js 来重现这一点,而无需

const web3 = require('web3');

// the balance is a `1` with 21 `0`-s after it
// typical token would return this value for an account with 1000 tokens
const balanceBN = new web3.utils.BN('1000000000000000000000');
const balance = balanceBN.toNumber();
这会引发以下错误:
Uncaught Error: Number can only safely store up to 53 bits
at assert (/some/path/node_modules/bn.js/lib/bn.js:6:21)
at BN.toNumber (/some/path/node_modules/bn.js/lib/bn.js:519:7)
因此,您的选择是:
  • 您可以使用.toNumber()如果BN足够小。
  • 如果BN太大,使用.div()在调用 .toNumber() 之前将其缩小.

  • 将上述内容应用于您的具体问题,关于获取代币余额,
    我们可以做到以下几点:
    const balanceBN = contract.methods.balanceOf(myAddress).call();
    const decimalsBN = contract.methods.decimals().call();

    // when we know that the BN is small engouh to be represented in JS number
    const decimals = decimalsBN.toNumber();

    // when we know that the BN is too alrge to be represented in JS number

    const balance = balanceBN.div(new web3.utils.BN(10).pow(decimalsBN)).toNumber();
  • 查询代币合约,获取余额和小数,均为BN
  • 使用 .toNumber() 直接将小数转换为数字, 因为我们希望它足够小
  • 分割余额BN 10 的小数次方 BN ,然后调用.toNumber就可以了

  • NOTE: The resulting value of balance will match the number of tokens that is typically show in user interfaces... not the value stored in the smart contract itself.

    关于javascript - 如何将 RSK 代币余额转换为 Javascript 数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67890334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com