Funktion wird nicht solide ausgeführt

Ich habe einen Smart Contract kopiert und von meinem Konto bei Mist on Rinkeby Network bereitgestellt.

Alle Funktionen funktionieren wie erwartet, bis auf eine. Ich werde den Code hier posten:

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);
     }
   }
 }

Hier ist der Screenshot des Fehlers

Ich führe diesen Vertrag von meinem Hauptkonto aus, das 2,97 Ether zur Verfügung hat.

  • Anzahl Token: 10000000.00000000
  • Dezimalstellen: 8

Ich übergebe ein Array von Adressen als 1. Parameter, z. B. ['Address1', 'Address2'] und die Anzahl der zu löschenden Token.

Immer wenn ich einen Tropfen von 10000000 Tropfen durchführe, funktioniert es gut, aber wenn ich sogar 1 weitere Ziffer erhöhe, sagen wir 100000000, dann tritt der im Bild gezeigte Fehler auf.

Was könnte das Problem sein?

Antworten (1)

Ich denke, das Problem ist diese Zeile im Vertrag,

  uint256 amt = amount * 10**8;

Das bedeutet, dass Ihre eingegebene Token-Anzahl mit 8 Dezimalstellen multipliziert wird.

Daher muss Ihre Eingabe in ganzen Token erfolgen. Wenn Sie 10000000.00000000 Token in Ihrem Konto haben, kann Ihre maximale Eingabe 10000000 betragen, geteilt durch die Anzahl der Adressen. (Da man übrigens keine Brüche eingeben kann, sind die 8 Nachkommastellen also völlig sinnlos...)

Ja, ich glaube auch, dass das ein Problem ist. Lass mich testen und melde mich bei dir.
Nachdem ich "* 10 ** 8" aus dieser Anweisung entfernt habe, habe ich diesen Fehler nicht erhalten und die Transaktion wird erfolgreich ausgeführt, aber abgelegte Token werden nicht im Empfängerkonto angezeigt.
Ich habe nicht wirklich vorgeschlagen, diese Zeile zu entfernen, sondern mir dessen bewusst zu sein, damit Ihr Eingabebetrag, Transaktionsbetrag und decimalsParameter alle konsistent sind. Wenn Sie es entfernen, können Sie es decimalsauf Null setzen und alles wird viel klarer (Sie werden immer mit ganzen Token handeln, also keine Verwirrung).
Was sind die Nachteile, wenn keine Dezimalstellen vorhanden sind?
Aus meiner Sicht überhaupt keine: Sie scheinen eine endlose Quelle der Verwirrung zu sein. In ERC20 decimalsist der Parameter nur für das UI - er hat keine interne Bedeutung im Vertrag. Einige UIs handhaben es und andere nicht, was nur zur Verwirrung beiträgt. Besser ohne, sage ich. Aber Dezimalzahlen können in einigen Anwendungsfällen sinnvoll sein, also ist die Einrichtung da, wenn Sie es wollen.
Hallo @pankaj - hat das deine Frage beantwortet? Wenn ja, wäre es gut, es zum Nutzen anderer als beantwortet zu markieren.