Geben Sie Token an den Eigentümer zurück und erhalten Sie Ether auf Ihr eigenes Konto

Ich arbeite an einem Smart Contract, bei dem es erforderlich ist, wenn jemand Token per Ether kauft und nach dem Kauf, ob er/sie den Token zurückgeben und das Ether-Guthaben zurückerhalten möchte. Wie in meiner Anforderung muss ich den Preis von Ether zur Laufzeit nach seinem/ihrem Kauf berechnen. Wenn ich also so codiere, 1000000000000000000ist hier fest codiert, aber in meinem Fall wird zur Laufzeit berechnet, um das Ether-Guthaben an den Kunden zurückzugeben.

function sell(uint256 amount) payable public  {
   msg.sender.transfer(1000000000000000000);        /// sends ether to the seller.  
 }

Dieser wirft folgenden Fehler

transact to Scalifyt5Token.sell errored: VM error: revert.
revert  The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value.  Debug the transaction to get more information. 

Wenn ich auf diese Weise den Etherbetrag aus der Eingabe in Ether eingebe, funktioniert das einwandfrei. aber das ist nicht meine Anforderung, da ich den Wei-Wert zur Laufzeit berechnen muss.

function sell(uint256 amount) payable public  {
   msg.sender.transfer(msg.value);        /// sends ether to the seller. 
}

Jede Hilfe wird geschätzt.

Vielen Dank im Voraus.

Antworten (1)

Wenn die Funktion kostenpflichtig ist, kann der Käufer Ether direkt senden. Ich denke, anstatt "verkaufen", sollte der Name der Funktion kaufen (schließlich ist der Benutzer, der die Funktion ausführt und er / sie kauft)

Vorausgesetzt, dass:

mult_decist eine Konstante gleich 10**decimalswo decimals = 18; Der Preis pro Token beträgt price(zum Beispiel 100000000000000000 wei = 1ETH)

function buyTokens() public payable{
    uint numberofTokens = msg.value.mul(mult_dec).div(price);        
    require(numberofTokens>0);
    balance[msg.sender] = balance[msg.sender].add(numberofTokens); 
}

Beachten Sie, dass beim Ausführen dieses Formularnebels Felder angezeigt werden, in die Sie die Menge an Ether eingeben können.

Für den Verkauf des Tokens an Ihren Vertrag:

function sellTokens(uint amountTokens) public {
    balance[msg.sender] = balance[msg.sender].sub(amountTokens);
    uint amountEther = amountTokens.mul(price).div(mult_dec);
    msg.sender.transfer(amountEther);
}

Weitere Informationen finden Sie auf der offiziellen Website von Ethereum am Beispiel eines Tokens

Hoffe das hilft.

BEARBEITEN:

Ich habe einen einfachen Kauf- und Verkaufsvertrag mit den oben genannten Funktionen implementiert und es funktioniert.

pragma solidity ^0.4.21;
library SafeMath {
    function add(uint a, uint b) internal pure returns (uint c) {
        c = a + b;
        require(c >= a);
    }
    function sub(uint a, uint b) internal pure returns (uint c) {
        require(b <= a);
        c = a - b;
    }
    function mul(uint a, uint b) internal pure returns (uint c) {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function div(uint a, uint b) internal pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }
}

contract MyContract{
    using SafeMath for uint256;

    uint public price;
    uint public mult_dec;
    mapping(address => uint) public balances;

    function MyContract() public {
        price = 1000000000000000000;
        mult_dec = 10**18;
    }

    function sellTokens(uint256 amountTokens) public {
        balances[msg.sender] = balances[msg.sender].sub(amountTokens);
        uint amountEther = amountTokens.mul(price).div(mult_dec);
        msg.sender.transfer(amountEther);
    }

    function buyTokens() public payable{
        uint numberofTokens = msg.value.mul(mult_dec).div(price);        
        require(numberofTokens>0);
        balances[msg.sender] = balances[msg.sender].add(numberofTokens); 
    }



}

Dieser Vertrag befindet sich unter 0xaaae538f158f3a0917ba466c33ab84a7976249c9. Sie können zwei Transaktionen sehen, eine Kauf- und eine Verkaufstransaktion.

Aus Ihrem Screenshot sehe ich, dass der Vertrag besagt, dass keine Token verkauft wurden, daher verstehe ich nicht, welche Token Sie zurückverkaufen. Schauen Sie, dass in Ihrem Vertrag die Variable totalSold = 0.

Zusammenfassend scheint der Fehler zu sein, dass in Ihrem Vertrag kein Ether zu senden ist.

Ich habe Ihren Code verwendet, den Sie sagten, Funktionsnamen werden nicht geändert, und wenn ich Token kaufe, wurde dies erfolgreich durchgeführt, aber als ich versuchte, zurückzukehren, gab das erneut einen Fehler. Screenshot: prntscr.com/j388mb
Ich habe gerade die Antwort bearbeitet. Kurz gesagt scheint Ihr Vertrag keinen Äther zu haben. Die Funktionen funktionieren wie erwartet.
Lassen Sie mich wissen, wie es geht
Danke. Schließlich habe ich das Problem in meinem Code, als wenn jemand den Token kaufte, schickte ich Ether an das Besitzerkonto in der buy()-Funktion wie dieser owner.transfer(msg.value); danach, wenn jemand den Token zurückgeben möchte, der versucht, Ether von Vertragsethern abzuziehen, und der Ether-Kontraktsaldo Null ist, so dass dieses Problem auftaucht. Also habe ich owner.transfer(msg.value) entfernt; zu kaufen und das funktioniert jetzt gut. Können Sie bitte vorschlagen, was der beste Ansatz ist, um Ether im Falle von buy() zu senden, und wenn ich ein Eigentümerkonto haben möchte, wie kann ich dann vom Eigentümer-/Betreiberkonto anstelle der Vertragsadresse abziehen?
wenn jemand die Token zurückgeben möchte.
Ich denke, die beste Lösung besteht aus mehreren Gründen darin, den Ether im Vertrag zu belassen: 1. Wenn der Vertrag sicher ist, den Ether dort zu belassen, vermeiden Sie es, für die Transaktionen zu bezahlen. 2. Vertrauen, wenn die Benutzer sehen, dass Sie den Ether auf Ihr privates Konto bringen, werden sie dem Vertrag nicht vertrauen, denn um den Token verkaufen zu können, müssen Sie nicht nur dem Code des Vertrags zustimmen. Wenn ich Ihre Frage beantwortet habe, akzeptieren Sie sie bitte, indem Sie auf das Häkchen klicken. Viel Glück