[Ethereum] ERC721 Error: invalid number value arg=”_tokenId”, coderType=”uint256″, value=

erc-721web3js

MyERC721:

pragma solidity ^0.5.0;

import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
import "openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol";
import "openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol";

contract MyERC721 is ERC721Full, ERC721Mintable, Ownable {

    constructor() ERC721Full("ThuleenCert721", "TC721") public {}

    /**
    * Custom function to create a unique token
    * @param _to The address that will receive the minted tokens.
    * @param _tokenId The token id to mint.
    * @param _tokenURI The token URI of the minted token.    
    */
    function mintUniqueTokenTo (
    address _to,
    uint256 _tokenId,               
    string  memory _tokenURI // Store, receipient's name, grade and program details
    ) public
    {        
        super.mint(_to, _tokenId);        
        super._setTokenURI(_tokenId, _tokenURI);
    }
}

MyDeployment script using web3 (version0.2)

var tx = await nft.mintUniqueTokenTo(
            receipientAddress,
            122164239941406260, // <- tokenId
            tokenURI, { from: coinbase }
        );

The script above works is tokenId is smaller, say "12216" but with the value of "122164239941406260" (18 digits) the script gave me the following error:

UnhandledPromiseRejectionWarning: Error: invalid number value (arg="_tokenId", coderType="uint256", value=122164239941406260)

In fact, I tested with different (tokenId) values and it works up to 16 digits.

So I "assumed" the error "invalid number value" means the value is too large? Really? How do I solve this?

Best Answer

In web3 v0.20 there's a utility function that will convert its parameter to BigNumber.

For example in your case :

const myTokenId = web3.toBigNumber('122164239941406260');

var tx = await nft.mintUniqueTokenTo(
    receipientAddress,
    myTokenId, // <- tokenId
    tokenURI, { from: coinbase }
);
Related Topic