I'm using the Zeppelin ERC20 code and I can't seem to transfer more than 9007000000000000 token "cents" at a time.

Address a has a balanceOf 1000000000000000000000000 (10 million tokens * 1000000000000000000 (because I'm using 18 decimals)). However, when I transfer('b', 1000000000000000000000000) from account a, Remix says: Error encoding arguments: Error: Assertion failed.

It gives me the same error for 100000000000000000000000, 10000000000000000000000, 1000000000000000000000, all the way down to 9007000000000000 (which it lets me transfer; it fails with slightly more (9008000000000000)).

balanceOf for both accounts checks out correctly afterwards.

Also, when I comment out the assert lines in SafeMath, Remix gives me the same error. There are no other assertions in the code.

What's going wrong here?

pragma solidity ^0.4.15;

library SafeMath {

  function sub(uint256 a, uint256 b) internal constant returns (uint256) {
    assert(b <= a);
    return a - b;

  function add(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;

using SafeMath for uint;

mapping(address => uint256) balances;

function balanceOf(address _owner) constant returns (uint256 balance) {
  return balances[_owner];

function transfer(address _to, uint256 _value) returns (bool) {
   balances[msg.sender] = balances[msg.sender].sub(_value);
   balances[_to] = balances[_to].add(_value);
   Transfer(msg.sender, _to, _value);
   return true;

1 Answer 1


Turns out large numbers need to be wrapped in quotes when using Remix, because of Javascript limitations, so `transfer('a', '100000000000000000000000') works.

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.