Estoy usando el código Zeppelin ERC20 y parece que no puedo transfer
usar más de 9007000000000000 "centavos" de token a la vez.
La dirección a
tiene un balanceOf
1000000000000000000000000 (10 millones de tokens * 1000000000000000000 (porque estoy usando 18 decimales)). Sin embargo, cuando me transfer('b', 1000000000000000000000000)
de cuenta a
, Remix dice: Error encoding arguments: Error: Assertion failed
.
Me da el mismo error para 100000000000000000000000, 10000000000000000000000, 1000000000000000000000, hasta 9007000000000000 (que me permite transferir; falla con un poco más (90008000000) 0000000).
balanceOf
para ambas cuentas sale correctamente después.
Además, cuando comento las assert
líneas en SafeMath
, Remix me da el mismo error. No hay otros assert
iones en el código.
¿Qué está yendo mal aquí?
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;
}
Resulta que los números grandes deben estar entre comillas cuando se usa Remix, debido a las limitaciones de Javascript, por lo que `transfer('a', '1000000000000000000000000') funciona.