Ich habe einen ERC20-Token-Vertrag geschrieben und ihn im Testnetzwerk mit dem Truffle-Framework bereitgestellt. Wenn ich den Token-Saldo für ein Konto mit web3 überprüfe, wird das Ergebnis in BigNumber angezeigt, wenn ich versuche, es mit toNumber () in eine Zahl umzuwandeln und ein unerwartetes Ergebnis zu erhalten.
Soliditätscode:
function balanceOf(address _from) constant public returns (uint256 balance) {
return balances[_from];
}
Javascript-Code:
instantiateBalance() {
const contract = require('truffle-contract')
const token = contract(Token)
token.setProvider(this.state.web3.currentProvider)
var tokenInstance;
token.deployed().then(function(instance) {
tokenInstance = instance;
return tokenInstance.balanceOf.call("0xb1Cf866ced575FD1A1997Daa5d6F099efb282E41", {from: "0xb1Cf866ced575FD1A1997Daa5d6F099efb282E41"});
}).then(function(balance) {
console.log(balance.toNumber());
})
erwartetes Ergebnis
Dezimalstellen = 18
Tatsächlicher Token-Saldo = 100000000.000000000000000000
Tatsächliche Ergebnis
Token-Guthaben = 100000000000
wie ein Äther, den Sie verwenden können
then(function(balance) {
console.log(web3.fromWei(balance.toNumber(), "ether" ) );
})
Verwenden Sie fromWei , um Ihre bigNumber in Ether umzuwandeln und dann in Number umzuwandeln. Beachten Sie, dass unnötige 0 nach dem Fließkomma nicht angezeigt werden.
In web3 ^1.0 kann es sich zu web3.utils.fromWei
statt web3.fromWei
doc ändern . Beachten Sie, dass truffle ^5.0 web3 ^1.0 verwendet.
Sagen wir 6. Sie müssen die Konvertierung manuell mit etwas wie:
var tokenBalance = balance.ToNumber() / Math.pow(10, tokenDecimals)
web3.fromWei(balance.toString(), "ether")
, beachten Sie .toString()
. Ich bin mir nicht sicher, ob dies die beste Vorgehensweise ist.Sie können die Exponentialzahlensyntax in Javascript verwenden, um Ihren Code zu verkürzen.
const balance = getBalance().toNumber() / 1E18
PS. Entschuldigung, ich kann wegen geringer Reputation keinen Kommentar abgeben.
Ich persönlich arbeite gerne mit großen Zahlen und zerlege sie nicht in "normale" Zahlen. Ich fürchte, ich fürchte, es könnte zu einem Überlauf kommen, wenn ich es nicht tue.
Wenn also ein Vertrag a zurückgibt uint
, dann parse ich den Rückgabewert in a BigNumber
(von bignumber.js ), wie folgt:
const balanceBefore = new BigNumber(await contract.getBalance(...));
und ich verwende die BigNumber
API gerne für meine Behauptungen, etwa so:
assert(balanceBefore.minus(amountSent).minus(gasCost).isEqualTo(balanceAfter));
Ein schneller Weg könnte sein
import web3 from 'web3';
const ethProvider = new web3(web3.givenProvider).eth;
const accounts = await ethProvider.requestAccounts();
const ethBalance = web3.utils.fromWei(await ethProvider.getBalance(accounts[0]), 'ether');
console.log(ethBalance);
Ich glaube, Sie wollen nur das Guthaben protokollieren, das Sie verwenden sollten
console.log(balance.toString());
stattdessen.
Es wird ein echter Fehler ausgegeben, dass die Zahl nicht in den js- number
Typ passen kann.
Rajesh
Karthikeyan Thangavel