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.
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:
Require this: require(msg.value%TokenPriceWei == 0)
, damit die Leute den genauen Betrag für eine ganzzahlige Anzahl von Token senden. (nicht so freundlich)
Holen Sie sich die Anzahl der Token als msg.value/TokenPriceWei
und geben Sie dann diesen Betrag an den Käufer zurück: msg.value % TokenPriceWei
, was der Rest der Teilung ist, in diesem Beispiel 3500/2000
wird 1
der Token gekauft und dann 1500wei
an den Benutzer zurückgegeben.
Verwenden Sie einen Multiplikator, um den Dezimalpunkt indirekt darstellen zu können. Fügen Sie decimals
dann 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 3500wei
erhalten Sie beispielsweise: 3500*1000/2000 = 3500000/2000 = 1750
Mist erhält, dass Dezimalzahlen sind, 1000
und zeigt an, dass der Benutzer 1.75
Token hat.
Ich hoffe es hilft.