7

I have written an ERC20 token contract and deployed it in test network using truffle framework. When I check the token balance for an account using web3 it was giving the result in BigNumber when I try to convert it to a number using toNumber() getting an unexpected result.

Solidity code:

  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());
})

Expected Result

Decimals = 18

Actual Token Balance = 100000000.000000000000000000

Actual Result

Token Balance = 1000000000000

Result:

  • 1
    did you try balance.div(1e18) or balance.toNumber().div(1e18) ? – Rajesh Oct 31 '17 at 5:16
  • balance.div(1e18) will give me the digits before the decimal point. I need digits after decimal point also to display exact balance. – Karthikeyan Thangavel Oct 31 '17 at 6:37
13

If your token have 18 decimals

like an ether you can use

then(function(balance) {
    console.log(web3.fromWei(balance.toNumber(), "ether" ) );
})

Use fromWei to convert your bigNumber to ether and then convert it to Number. Be aware that unnecessary 0 after the floating point will not be displayed.

In web3 ^1.0 it may change to web3.utils.fromWei instead of web3.fromWei doc. Note that truffle ^5.0 uses web3 ^1.0.

If you have a different token decimal

Let's say 6. You'll have to do the conversion manually with something like:

var tokenBalance = balance.ToNumber() / Math.pow(10, tokenDecimals)
  • 1
    I experienced a problem with this example, if the balance had 18 decimals it would strip it back to 16. To fix this I used web3.fromWei(balance.toString(), "ether"), notice .toString(). I'm unsure if this is best practice. – Sean Bannister Feb 21 '18 at 14:53
5

You can use exponential number syntax in javascript to shorten you code.

Example (18 decimals):

const balance = getBalance().toNumber() / 1E18

PS. Sorry, i can not make comment due to low reputation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.