Problema con el Uint256

Esta es mi primera publicación aquí, no pude encontrar la respuesta a mi problema cuando busqué. Estoy usando Remix con Metamask, creé el contrato y uso el siguiente código para acuñar. Tengo un límite de acuñación en el contrato. sin embargo, el token me muestra el suministro total como un valor enorme "10000000000000000000", que ya es más alto que el límite de suministro total, por lo que el control de acuñación detiene la ejecución.

[![ingrese la descripción de la imagen aquí][1]][1]

   function mint(uint noOfTokens) returns (bool) {
      checkTokens = _totalSupply.add(noOfTokens); 
   // Check the max limit and the owner before minting 
   require(_totalSupply <= maxLimit 
            && checkTokens <= maxLimit 
            && (msg.sender == address(owner)));
    balances[owner] = balances[owner].add(noOfTokens);
   _totalSupply        = _totalSupply.add(noOfTokens);
   return true;

}

Las variables se definen como uint256.

Gracias por la ayuda y el apoyo. NKB.

[![ingrese la descripción de la imagen aquí][2]][2]

solidez de pragma ^0.4.11;

//Importar interfaz ERC20 './ERC20.sol'; // Matemáticas seguras para ataques por encima y por debajo del valor. importar './SafeMath.sol';

La prueba de contrato es ERC20 { // usando matemáticas seguras para uint256
usando SafeMath para uint256;

uint256 public constant maxLimit = 500000000; 
uint256 public  _totalSupply = 0; 
string public constant symbol = "Test";
string public constant name = "TestCoin";
uint8 public constant decimals = 0;
// Rate -> 1 Ether = 1000 Just 
uint256 public RATE; 
// Ether reciever 
address public owner;
uint public start;
uint public startWeek;
uint public startTwoWeek;
uint public startFourWeek;
uint256 public tokens;
uint256 public checkTokens;

mapping(address=> uint256) balances; 
mapping(address=>mapping(address=>uint256)) allowed;


 // Fallback function
 // The function without name is the default function that is called 
 // whenever anyone sends funds to a contract

function() payable{
    createTokens();
}

function Test(){
   // balances[msg.sender] = _totalSupply;
owner  = msg.sender;  // get the owner of the token
start  = now;  // Get the current block time 
startWeek = start + 30 minutes ; // Get the scond block time
startTwoWeek = start + 60 minutes; // Get the third block time 
startFourWeek = start + 90 minutes; // Get the fourth block time . 

}

// Create new tokens
   function mint(uint noOfTokens) returns (bool) {
      checkTokens = _totalSupply.add(noOfTokens); 
   // Check the max limit and the owner before minting 
   require(_totalSupply/1000000000000000000 <= maxLimit 
            && checkTokens/1000000000000000000 <= maxLimit 
            && (msg.sender == address(owner)));
    balances[owner] = balances[owner].add(noOfTokens);
   _totalSupply     = _totalSupply.add(noOfTokens);
   return true;

}

 function createTokens() payable {
    require(msg.value >0 && _totalSupply <= maxLimit);

    if (now <= startWeek   && now > start) {
    RATE =    1150; 
    tokens = msg.value.mul(RATE);
    balances[msg.sender] = balances[msg.sender].add(tokens);
    _totalSupply = _totalSupply.add(tokens);
    owner.transfer(msg.value);
}

 if (now <= startTwoWeek && now > startWeek ) {
    RATE =    1100;
    tokens = msg.value.mul(RATE);
    balances[msg.sender] = balances[msg.sender].add(tokens);
    _totalSupply = _totalSupply.add(tokens);
    owner.transfer(msg.value);
 }

if (now <= startFourWeek && now > startTwoWeek ) {
    RATE =    1050;
    tokens = msg.value.mul(RATE);
    balances[msg.sender] = balances[msg.sender].add(tokens);
    _totalSupply = _totalSupply.add(tokens);
    owner.transfer(msg.value);
 }
 if (now > startFourWeek ) {
    RATE =    1000;
    tokens = msg.value.mul(RATE);
    balances[msg.sender] = balances[msg.sender].add(tokens);
    _totalSupply = _totalSupply.add(tokens);
    owner.transfer(msg.value);
 }


}
  function totalSupply() constant returns (uint totalSupply){
      return _totalSupply;
  }

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

  function transfer(address _to, uint _value) returns (bool success){
      require( balances[msg.sender] >= _value &&
          _value > 0 );
          balances[msg.sender] = balances[msg.sender].sub(_value) ;
          balances[_to] = balances[_to].add(_value);
          Transfer(msg.sender,_to,_value);
          return true;
  }

  function transferFrom(address _from, address _to, uint _value) returns (bool success){
      require( allowed[_from][msg.sender] >= _value &&
      balances[_from] >= _value
      && _value > 0 );
    balances[_from]  = balances[_from].sub(_value);
    balances[_to]    = balances[_to].add(_value);
    allowed[_from][msg.sender]  = allowed[_from][msg.sender].sub(_value);
    Transfer(_from,_to,_value);
    return true;
  }

  function approve(address _spender, uint _value) returns (bool success){
   allowed[msg.sender][_spender] = _value;
   Approval(msg.sender,_spender,_value);
   return true;

  }

  function allowance(address _owner, address _spender) constant returns (uint remaining){
    return allowed [_owner][_spender];  
  }
  event GoalReached(address beneficiary, uint amountRaised);
  event Transfer(address indexed _from, address indexed _to, uint _value);
  event Approval(address indexed _owner, address indexed _spender, uint _value);

}

ingrese la descripción de la imagen aquíaunque el token se define con cero decimales toma 18 decimales para el wei y pone el valor con todos los decimales.

Respuestas (1)

Debido a que tiene su decimalsconjunto en 18, debe dividir por (1 seguido de 18 ceros) para obtener el valor entero de1,000,000,000,000,000,000 _totalSupply.

18 decimales es el estándar para Ethereum. La unidad más pequeña se conoce como Wei . 1 000 000 000 000 000 000 wei equivalen a 1 éter. Aquí hay un mapa de la unidad.

Para simplificar su contrato, puede establecer los decimales en 0, en cuyo caso solo estaría tratando con valores enteros que NO son divisibles. La desventaja es que NO podrías ofrecer fracciones de un token.

Gracias por su respuesta, entiendo que intentaré ahora y actualizaré aquí.
Hola nyusternie, probé la segunda opción para mantener los decimales en 0, pero sigue igual. uint256 constante pública maxLimit = 500000000; uint256 public _totalSupply = 0; cadena símbolo de constante pública = "PRUEBA"; string nombre de constante pública = "TestCoin001"; uint8 decimales constantes públicos = 18;
reducir los decimales a 0 uint8 public constant decimals = 0; y luego aumentar la oferta total a un número mayor o igual amaxLimit uint256 public _totalSupply = <enter-total-supply-here>;