Ich verwende den Zeppelin ERC20-Code und kann nicht transfer
mehr als 9007000000000000 Token "Cents" gleichzeitig haben.
Die Adresse a
hat einen Wert von balanceOf
10000000000000000000000 (10 Millionen Token * 100000000000000000 (weil ich 18 Dezimalstellen verwende)). Wenn ich jedoch transfer('b', 1000000000000000000000000)
vom Konto a
gehe, sagt Remix: Error encoding arguments: Error: Assertion failed
.
Es gibt mir den gleichen Fehler für 1000000000000000000000, 1000000000000000000000, 100000000000000000000, bis hinunter zu 9007000000000000 (was es mich übertragen lässt; es schlägt mit etwas mehr (900800000)00 fehl).
balanceOf
für beide Konten checkt danach korrekt aus.
Auch wenn ich die assert
Zeilen in SafeMath
auskommentiere, gibt Remix mir den gleichen Fehler. Es gibt keine anderen assert
Ionen im Code.
Was läuft hier schief?
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;
}
Es stellt sich heraus, dass große Zahlen bei der Verwendung von Remix aufgrund von Javascript-Einschränkungen in Anführungszeichen gesetzt werden müssen , damit `transfer('a', '100000000000000000000000') funktioniert.