Al usar MEW Error encontrado durante la ejecución del contrato [Instrucción incorrecta]

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;
  }
Es difícil saberlo según esta información: un hash de Tx o un ejemplo de Tx sería algo. Sin embargo, una suposición: si su contrato se establece 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.
Pero en caso de metamask con remix funciona bien...
Sí, ese es mi punto. No creo que Metamask tenga en cuenta el decimalsvalor 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.
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 lo multiplicó por 10^18 para dar cuenta del decimalsvalor del contrato; si es así, acerté :-)
:-( Gracias, ¿Cómo manejar este problema en ese caso? ¿Eliminar decimales o multiplicaciones? Los parámetros del contrato son los siguientes: uint public constant maxLimit = 500000000; uint public _totalSupply = 0; string public constant symbol = "JUST13"; string public constant name = "TestCoinOct131"; uint8 decimales constantes públicos = 18; // Tasa -> 1 Ether = 1000 Justo
Cualquiera de los dos sería suficiente, pero los contratos de token ERC20 habituales no hacen la multiplicación: asumen que todos los datos internos y de entrada están en términos del token base. Luego se decimalsusa 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.
Gracias, funcionó, eliminé la multiplicación, los valores de transferencia funcionan bien.

Respuestas (1)

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 decimalsel contrato.

Puede configurarlo decimalsen 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 decimalsvalor 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.