Wie übergebe ich einen Bruchwert in buyPrice?

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 buyFunktion 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 buyPricesollte 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?

Antworten (2)

Wenn Sie sagen, dass buyPrice1/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 buyPricesollte 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.valuemit multiplizieren 1 etherund 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;    
  }