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, 1000000000000000000
ist 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.
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_dec
ist eine Konstante gleich 10**decimals
wo 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.
Kamran Jabbar
Jaime
Jaime
Kamran Jabbar
Kamran Jabbar
Jaime