Unable to call contract function from web3 with big number as parameter

Viewed 20314

I am trying to call a custom function of a contract that expects a parameter of unit256.

I'm calling this function from web3 with this value as parameter: 10000000000000000000 (10 with 18 zeros) As soon as this call is hit by web3, I faced following Big number error:

Error: overflow (fault="overflow", operation="BigNumber.from", value=10000000000000000000, code=NUMERIC_FAULT, version=bignumber/5.0.0-beta.138)**

Does anyone know the cause?

Here is the function of the contract I'm calling:

function lock(
    address tokenAddress,
    uint256 amount
)

and here is the web3 code snippet:

Contract.methods.lock(0x57AA33D53351eA4BF00C6F10c816B3037E268b7a, 10000000000000000000,
        ).send({
            from: accounts[0],
            gasLimit: 500000,
            value: 0
        });

I tried the same function with small values for amount and it worked e.g. 1(with 18 zeros)

4 Answers

I tried sending the parameter as a String and it worked.

I'm using BigInt in my Truffle UnitTest

it('should return correct balances when transfer', async () => {
    const receiver = accounts[2];
    const balanceOfOwner = await contractInstance.balanceOf.call(owner);
    assert.equal(balanceOfOwner, totalSupply * 10 ** decimals, 'Total balance');

    const sendAmount = 69 * 10 ** decimals;
    await contractInstance.transfer(receiver, BigInt(sendAmount), {
      from: owner,
    });

    const balanceOfReceiver = await contractInstance.balanceOf.call(receiver);
    assert.equal(balanceOfReceiver, sendAmount, 'Received sendAmount');
    assert.equal(
      await contractInstance.balanceOf.call(owner),
      balanceOfOwner - sendAmount,
      'Decreased to'
    );
  });

To enable the BigInt global you can add a comment to your code:

/* global BigInt */

and here is the web3 code snippet:

Contract.methods.lock(0x57AA33D53351eA4BF00C6F10c816B3037E268b7a, 
   BigInt(10000000000000000000)).send({
      from: accounts[0],
      gasLimit: 500000,
      value: 0
   });

For me, I was trying to call .toNumber() on a BigNumber and the error came up. It went away when I used .toString() instead

x.toString();
Related