Ich setze ein erc-20-Token mit 18 Dezimalstellen ein. Und ich möchte, dass, wenn jemand die Kauffunktion mit 1 ETH aufruft, der Vertrag 1500 Token an zurückgeben sollte msg.sender
. Die buy
Funktion ist implementiert als:
function buy() public payable returns (uint){
require(msg.sender != address(0));
require(msg.value >= 0);
uint amount = msg.value.div(buyPrice);
require(balances[this] >= amount);
uint oldBalance = balances[this].add(balances[msg.sender]);
balances[this] = balances[this].sub(amount);
balances[msg.sender] = balances[msg.sender].add(amount);
uint newBalance = balances[this].add(balances[msg.sender]);
assert(newBalance == oldBalance);
Transfer(this, msg.sender, amount);
return amount;
}
Gemäß der Implementierung dieser Methode buyPrice
sollte die 1/1500
. Aber da buyPrice uint ist, kann ich keine Dezimalwerte an diese Variable übergeben.
Gibt es eine Problemumgehung? Muss ich die Standard-Kauffunktion für meinen Fall ändern?
Wenn Sie sagen, dass buyPrice
1/1500 sein sollte, meinen Sie damit, dass der Benutzer für jedes 1 eth 1500 des Tokens erhalten sollte? Wenn das der Fall ist, dann buyPrice
sollte der eigentlich 1500 sein und in etwas wie umbenannt werden tokensToEth
, und die Betragszuweisung sollte seinuint amount = msg.value.mul(tokensToEth);
Lösung zu meiner eigenen Frage posten. Wie ich dachte, musste ich Änderungen in der Standard-Kauffunktion vornehmen.
Änderung 1: Der Betrag wurde mit 1 Ether multipliziert, also 10^18, also wurde der Kaufpreis in meinem Fall 10^18/1500. Jetzt wird buyPrice in Wei festgelegt.
Änderung2: Erst msg.value
mit multiplizieren 1 ether
und dann durch dividieren buyPrice
. Kehren Sie die Reihenfolge nicht um, da das Teilen eines sehr kleinen Werts zuerst zu einem Nullwert führen kann und die anschließende Multiplikation keine Wirkung hat.
Änderung 3: Überprüfen Sie, ob der Betrag größer als Null ist, bevor Sie mit der Verwendung fortfahrenrequire(amount > 0);
Endgültige Kauffunktion wurde zu:
function buy() public payable returns (uint){
require(msg.sender != address(0));
require(msg.value >= 0);
uint amount = msg.value.mul(1 ether).div(buyPrice);
require(amount > 0);
require(balances[this] >= amount);
uint oldBalance = balances[this].add(balances[msg.sender]);
balances[this] = balances[this].sub(amount);
balances[msg.sender] = balances[msg.sender].add(amount);
uint newBalance = balances[this].add(balances[msg.sender]);
assert(newBalance == oldBalance);
Transfer(this, msg.sender, amount);
return amount;
}