Estoy enfrentando un problema con la transferencia de tokens, cuando uso REMIX con Metamask, la transferencia de tokens de una cuenta que no es propietaria a otra cuenta funciona bien. Sin embargo, al usar MEW o MIST, la transacción falla.
function transfer(address _to, uint _value) returns (bool success){
require( balances[msg.sender] >= _value &&
_value > 0 );
_value = _value.mul(1000000000000000000);
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( balances[_from] >= _value && _value > 0 );
_value = _value.mul(1000000000000000000);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(_from,_to,_value);
return true;
}
La transacción que falló es ropsten.etherscan.io/tx/...
Esta transacción intenta transferir 10^22 tokens base (0x21e19e0c9bab2400000). Luego multiplicas por 10^18 en tu contrato. A menos que tenga 10 ^ 40 tokens base en su cuenta, fallará.
Supongo que tenía la intención de transferir 10 000 tokens, pero la interfaz de usuario (MEW y Mist, pero no en el caso de Metamask) lo multiplicó por 10^18 para dar cuenta del valor proporcionado por decimals
el contrato.
Puede configurarlo decimals
en 0 o eliminar la multiplicación por 10 ^ 18 para que sea más intuitivo. ¡En mis contratos de fichas no tengo decimales ni multiplicaciones! Pero el enfoque habitual del contrato de token ERC20 es no hacer la multiplicación. Asumen que todos los datos de entrada e internos están en términos del token base. Luego, el decimals
valor se usa para que las interfaces de usuario de front-end se muestren y se conviertan de tokens de visualización a tokens básicos. Es una gran fuente de confusión y necesita saber si su front-end está realizando la conversión o no. Por lo general, puede calcularlo según el saldo de la cuenta que le muestran. Pero, sí, no es genial.
benjaminion
decimals
en 18, Mist & MEW puede duplicar la multiplicación por 10 ^ 18. Es decir, intenta transferir 1 token completo en MEW; recoge la configuración de decimales y multiplica por 10 ^ 18 para obtener la cantidad de tokens base; el contrato se multiplica de nuevo por 10^18, pero no tienes 10^36 fichas base. Como digo, una suposición.Naval
benjaminion
decimals
valor del token. Lo que debe hacer es comparar los datos de transacción de un Tx exitoso con Metamask y uno fallido con MEW o Mist. Esto lo revelará todo. Agregue la información a su pregunta si necesita una mano para interpretarla. Estoy feliz de mirarlo.Naval
benjaminion
decimals
valor del contrato; si es así, acerté :-)Naval
benjaminion
decimals
usa para que las interfaces de usuario de front-end muestren y conviertan tokens de visualización en tokens base. Es una gran fuente de confusión y necesita saber si su front-end está realizando la conversión o no. Por lo general, puede calcularlo según el saldo de la cuenta que le muestran. Pero, sí, no es genial. Si no le importa, promoveré lo anterior como una respuesta, y sería bueno si pudiera aceptarlo. Gracias.Naval