Función que no se ejecuta en Solidity

Copié un contrato inteligente y lo implementé desde mi cuenta en Mist en Rinkeby Network.

Todas las funciones funcionan como se esperaba, excepto una. Voy a publicar el código aquí:

event PerformingDrop(uint count);
function drop(address[] addresses, uint256 amount) public onlyOwner {
  uint256 amt = amount * 10**8;
  require(amt > 0);
  require(amt <= SUPPLY_CAP);
  PerformingDrop(addresses.length);

  // Maximum drop is 1000 addresses
  assert(addresses.length <= 1000);
  assert(balances[owner] >= amt * addresses.length);
  for (uint i = 0; i < addresses.length; i++) {
    address recipient = addresses[i];
    if(recipient != NULL_ADDRESS) {
      balances[owner] -= amt;
      balances[recipient] += amt;
      Transfer(owner, recipient, amt);
     }
   }
 }

Aquí está la captura de pantalla del error.

Estoy ejecutando este contrato desde mi cuenta principal que tiene 2,97 ether disponibles.

  • Nº de tokens: 10000000.00000000
  • Decimales : 8

Estoy pasando una matriz de direcciones como primer parámetro, por ejemplo, ['Dirección1', 'Dirección2'] y la cantidad de tokens para colocar.

Cada vez que realizo una caída de 10000000 funciona bien, pero si aumento incluso 1 dígito más, digamos 100000000, entonces ocurre el error que se muestra en la imagen.

¿Cual podría ser el problema?

Respuestas (1)

Creo que el problema es esta línea en el contrato,

  uint256 amt = amount * 10**8;

Esto significa que su número de fichas de entrada se está multiplicando para dar cuenta de los 8 lugares decimales.

Por lo tanto, su entrada debe ser en términos de tokens completos . Si tiene 10000000.00000000 tokens en su cuenta, su entrada máxima puede ser 10000000, dividida por la cantidad de direcciones. (Por cierto, dado que no puede ingresar fracciones, esto significa que los 8 lugares decimales son totalmente inútiles...)

Sí, también creo que eso es un problema. Déjame probar y te vuelvo a contactar.
Después de eliminar "* 10 ** 8" de esa declaración, no recibí ese error y la transacción se ejecuta correctamente, pero los tokens eliminados no aparecen en la cuenta del receptor.
Realmente no estaba sugiriendo eliminar esa línea, solo ser consciente de ello para que el monto de entrada, el monto de la transacción y el decimalsparámetro sean todos consistentes. Si lo elimina, puede establecerlo decimalsen cero y todo será mucho más claro (siempre estará tratando con tokens completos, por lo que no hay confusión).
¿Cuáles son los inconvenientes de no tener decimales?
Ninguno en absoluto, en mi opinión: parecen ser una fuente interminable de confusión. En ERC20, el decimalsparámetro es solo para la interfaz de usuario; no tiene un significado interno en el contrato. Algunas interfaces de usuario lo manejan y otras no, lo que aumenta la confusión. Mejor sin, digo. Pero los decimales pueden tener sentido en algunos casos de uso, por lo que la función está ahí si la desea.
Hola @pankaj - ¿Respondió esto a tu pregunta? Si es así, sería bueno marcarlo como respondido para beneficio de los demás.