Ich experimentiere mit dem MyAdvancedToken
Code unter: https://www.ethereum.org/token
function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public {
sellPrice = newSellPrice;
buyPrice = newBuyPrice;
}
function buy() payable public {
uint amount = msg.value / buyPrice; // calculates the amount
_transfer(this, msg.sender, amount); // makes the transfers
}
Wenn die amount purchased = msg.value/buyPrice
, wie ist es jemals möglich, einen Token zu kaufen, der weniger als 1ETH wert ist? buyPrice
kann keine Dezimalzahl kleiner als 1 sein. Mit anderen Worten, ich möchte, dass eine Person 1 ETH senden und 10 Token erhalten kann. Diese Mathematik lässt das nicht zu ( buyPrice
kann nicht 0,1 sein).
Ein Teil der Dokumentation besagt das value
und buyPrice
sollte in wei sein, nicht in ETH. In diesem Fall könnte ich die Mathematik zum Laufen bringen. Beim Testen mit MyEtherWallet und der Ethereum Wallet-Anwendung sehe ich jedoch, dass ich msg.value
als ETH rüberkomme. Wenn ich 1 ETH sende, mit buyPrice = 10
, kauft der Benutzer am Ende 0,1 Token.
Gibt es einen Trick, um msg.value
wei anstelle von ETH zu bekommen?
Danke.
Innerhalb eines Vertrages msg.value
ist immer Wei. Front-End-Anwendungen zeigen manchmal Werte in Eth als „Bequemlichkeit“ für den Benutzer an, aber innerhalb der Transaktion ist es immer Wei.
Beachten Sie, dass Ähnliches für Token-Werte innerhalb von Verträgen gilt. MyAdvancedToken
Dieses Token ist beispielsweise decimals
auf 18 gesetzt (dasselbe wie Ether). Wenn Sie 0,1 Token kaufen, kaufen Sie intern tatsächlich 10 17 Token. Eine Benutzerschnittstelle kann den decimals
Parameter verwenden, um dies zur Anzeige in 0,1 zu übersetzen.
[Um das jetzt zu erweitern, ich bin nicht mehr auf dem Handy.]
Sowohl für Ether als auch für Token gibt es zwei Dinge:
decimals
. Das ist oft auch 18, muss aber nicht sein.In Ihrem Beispiel MyAdvancedToken
ist es decimals
gleich 18, genau wie Ether. Sie können also nicht mehr Token ausgeben als die Menge an Ether, die hereinkommt, da buyPrice
es sich um eine Ganzzahl von eins oder mehr handelt.
Wenn Sie 10 Token für 1 Eth ausgeben möchten, können Sie einen der folgenden Schritte ausführen:
buyPrice
Auf 1 und 17 einstellen decimals
. Jeder Wei kauft 1 Token, aber die Benutzeroberfläche zeigt ihn als 10x größer an.
Stellen Sie buyPrice
auf 10 17 und decimals
auf 0 ein. Jeder Ether kauft 10 Basis-Token und sie werden als ganze Token angezeigt.
buyPrice
Auf 10 x und decimals
auf einstellen 17 - x
.
Oder Sie können das alles vergessen und einfach mit der Umkehrung von buyPrice
(10) multiplizieren, anstatt durch den Kaufpreis zu dividieren. Dies ist wahrscheinlich das einfachste.
Das alles bereitet natürlich große Kopfschmerzen. Ich hasse das ERC20-Token- decimals
Konzept wirklich. Hier ist eine lange Diskussion darüber. Ich bevorzuge Hardcoding decimals
auf 0, fwiw.
GAEfan