2

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;
 }
will_durant
  • 1,154
  • 1
  • 9
  • 21

1 Answers1

3

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

will_durant
  • 1,154
  • 1
  • 9
  • 21