¿Cuál es la mejor manera de manejar los decimales cuando creo una moneda?
Usemos un ejemplo. Tengo KARLCOIN (KARL), y tengo 1,000,000 de ellos, y el token tiene 6 decimales. Este token también tendrá un crowdfund donde 100 KARL = 1 ETH (0.01 ETH/KARL).
Cuando creo este contrato, debo hacer algo como:
// Constructor
function token() {
owner = msg.sender;
totalSupply = 1000000;
balances[owner] = totalSupply;
decimals = 6;
symbol = "KARL";
}
Y luego ese token también tiene una función para transferir.
Ahora, ¿cómo estoy calculando, transfiriendo y mostrando estas cantidades? Por ejemplo, 1.000.000 KARL es 1.000.000.000.000 de la unidad más pequeña de mi moneda. Llamémoslo microKarl, o mk.
¿Eso significa que el suministro total en mi constructor debería ser 1,000,000,000,000? Cuando transfiero cantidades a personas, ¿lo estoy transfiriendo en mK? ¿Básicamente la cantidad de Karl * 1,000,000 para ponerlo en su forma de microKarl? ¿Cómo sabrán MyEtherWallet y MetMask y demás cómo mostrar la cantidad correcta?
Si estuviera usando web3 para mostrarlo, podría hacer los cálculos y mostrarlo yo mismo. Obtenga la cantidad en mK, multiplíquela por 0.000001 y luego siga mi camino. ¿Derecha? ¿O estoy fuera de pista aquí?
Hice un token e hice algo como esto (ha sido una noche larga) y me envié los tokens y en MetaMask dice la cantidad correcta. En Etherscan no lo hace, muestra una cantidad mucho menor y también dice que los decimales son "18" cuando MetaMask los tomó como 6 simplemente pegando la dirección del contrato.
Estoy un poco confundido sobre la decimalización de tokens y siento que no tengo la base de lo que estoy haciendo para depurar esto. Cualquier claridad sería apreciada.
Si su token sigue el estándar ERC20 (y debería hacerlo si desea que lo manejen billeteras o aplicaciones de clientes), puede incluir (no es obligatorio pero lo manejan la mayoría de los clientes) información de decimales .
Entonces su contrato debe contener algo como:
uint8 public constant decimals = 6;
Y su código debe asumir que las cantidades están en las unidades más pequeñas posibles.
Úselo de la siguiente manera:
uint256 public constant decimals = 6;
uint256 public constant totalSupply = 1000000*10**decimals;
diabetesjones
Michał Kłeczek
diabetesjones
diabetesjones
Michał Kłeczek
diabetesjones