¿Cuántos tokens se transfieren realmente cuando usamos decimales?

Tengo un código a continuación y cuando estoy transfiriendo 1,695,000,000 a una dirección en particular, en realidad se están transfiriendo 0.000000001695. ¿Por que es esto entonces? ¿Eso significa que para transferir 1.695 mil millones de tokens necesito poner 18 ceros iniciales? Aquí está el código:

function transfer(address _to, uint256 _amount) public returns (bool success) {
    require(_to != address(0));
    require(balances[msg.sender] >= _amount && _amount > 0
        && balances[_to].add(_amount) > balances[_to]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_amount);
    balances[_to] = balances[_to].add(_amount);
    Transfer(msg.sender, _to, _amount);
    return true;
  }


contract SomeToken is MintableToken, BurnableToken {
     string public name ;
     string public symbol ;
     uint8 public decimals = 18 ;

     /**
     *@dev users sending ether to this contract will be reverted. Any ether sent to the contract will be sent back to the caller
     */
     function ()public payable {
         revert();
     }

     /**
     * @dev Constructor function to initialize the initial supply of token to the creator of the contract
     * @param initialSupply The initial supply of tokens which will be fixed through out
     * @param tokenName The name of the token
     * @param tokenSymbol The symbol of the token
     */
     function SomeToken(
            uint256 initialSupply,
            string tokenName,
            string tokenSymbol
         ) public {
         totalSupply = initialSupply.mul( 10 ** uint256(decimals)); //Update total supply with the decimal amount
         name = tokenName;
         symbol = tokenSymbol;
         balances[msg.sender] = totalSupply;

         //Emitting transfer event since assigning all tokens to the creator also corresponds to the transfer of tokens to the creator
         Transfer(address(0), msg.sender, totalSupply);
     }
}
Pero eso es arrojar un error. Supongamos que mi suministro total es 5,000,000,000 y cuando intento transferir a 2 mil millones con 18 0 iniciales, muestra un error en el remix "SomeToken.transfer errored: Error encoding arguments: Error: Assertion fail ".
tienes que añadir esta líneatokenCount ** uint256(decimals)
En lugar de agregar ceros a la izquierda, actualice su contrato con la línea anterior para tokenCount
¿Puede informar un poco más dónde se agregará esta línea?
Actualice el código con la función de transferencia en su contrato
Considere votar las respuestas si las encuentra útiles.

Respuestas (2)

Tus fichas se dividen en X decimales (18 en tu caso). Por defecto (y por convención) las transferencias se basan en la cantidad más baja posible para que no haya números decimales en las transferencias. Por lo tanto, transferir una cantidad de 1 significa transferir 0.000000000000000001 (17 ceros) tokens.

Me imagino que esto es principalmente para que no tengamos que lidiar con números fraccionarios que requerirían más almacenamiento y son más difíciles de entender para los programas. El éter funciona de la misma manera.

Cuando llama a la función para transferir las monedas (transferencia), debe multiplicar el parámetro 'cantidad' por 10 ** uint (decimales). Que hará.

Esto es complicado ya que solo es necesario si llama directamente a la función de transferencia. Si realiza una transacción desde su billetera a cualquier otra dirección, no necesita hacerlo porque la billetera 'sabrá' que está utilizando un número particular de decimales en su contrato. La función 'transferir' por sí sola no sabe esto.

Nota: la función de transferencia debe estar dentro del cuerpo del contrato.