Token-Betrag berechnen

Ich habe Variable: TokenPriceWei = 2000 , das heißt, ich habe 1 Token-Preis für 2000 Wei festgelegt.

Wenn ich msg.value bekomme, ist es richtig tokensAmount = (msg.value / TokenPriceWei) , um den richtigen Token-Betrag zu erhalten?

Ich frage mich, weil ich einige Beispiele gesehen habe und keiner von ihnen dies bei der Berechnung der Token / Wei-Rate tut.

Antworten (1)

Das ist theoretisch richtig, aber denken Sie daran, dass Sie keinen Dezimalpunkt in Solidität darstellen können.

wenn du 3500wei sendest ist die operation 3500/2000 = 1 und nicht 1,75. Es gibt drei Lösungen:

  1. Require this: require(msg.value%TokenPriceWei == 0), damit die Leute den genauen Betrag für eine ganzzahlige Anzahl von Token senden. (nicht so freundlich)

  2. Holen Sie sich die Anzahl der Token als msg.value/TokenPriceWeiund geben Sie dann diesen Betrag an den Käufer zurück: msg.value % TokenPriceWei, was der Rest der Teilung ist, in diesem Beispiel 3500/2000wird 1der Token gekauft und dann 1500weian den Benutzer zurückgegeben.

  3. Verwenden Sie einen Multiplikator, um den Dezimalpunkt indirekt darstellen zu können. Fügen Sie decimalsdann eine Variable hinzu:

    decimals = 10**3; // 3 is the number of decimal points, it can be anything you want, 18 is most used in tokens

    numberoftokens = (masg.value*decimals)/TokenPriceWei;

    Beachten Sie, dass dies eine große Anzahl von ERC20-Token ergibt. Mist verwendet die variablen Dezimalstellen, um den Wert zu korrigieren, wenn er den Benutzern präsentiert wird. Sie müssen sich diesen Multiplikator bei allem merken, was Sie mit den Token tun, so machen es die meisten Token-Verträge. Im Beispiel von 3500weierhalten Sie beispielsweise: 3500*1000/2000 = 3500000/2000 = 1750Mist erhält, dass Dezimalzahlen sind, 1000und zeigt an, dass der Benutzer 1.75Token hat.

Ich hoffe es hilft.