Smart Contract zum Senden von Ether

Ich habe einen Solidity-Vertrag, der Ether an jemanden senden soll. Leider gibt es mir eine kryptische Fehlermeldung, nachdem ich die Transaktion in MetaMask bestätigt habe.

Ich teste in einem lokalen Ethereum-Netzwerk, das auf Ganache läuft, und das Projekt wurde mit einer reagierenden Trüffelbox erstellt.

Vertrag:

pragma solidity ^0.4.24;

contract Sender {
    uint256 public balance;

    function send(address _receiver) payable {
        msg.sender.transfer(msg.value);
    }

    function getBalance() public returns (uint) {
        return address(this).balance;
    }

}

JavaScript

userInputHandler = (event) => {
    this.setState({amountToPay: event.target.value})

    const contract = require('truffle-contract')
    const sender = contract(Sender);
    sender.setProvider(this.state.web3.currentProvider);

    this.state.web3.eth.getAccounts((error, accounts) => {
        sender.deployed().then((instance) => {

            console.log("Seems to explode after here" );
            return instance.sendTransaction({
                from: accounts[0],
                to: accounts[4],
                value: this.state.web3.toWei(this.state.amountToPay, "ether"),
                gas: "220000"}).then((result) => {

                console.log("result: " + result);
        })
    })
})

};

Fehlermeldung

inpage.js:1
MetaMask - RPC Error: Error: Error: [ethjs-rpc] rpc error with payload
{
"id": 8476063269707,
"jsonrpc": "2.0",
"params": ["0xf87182011a85174876e80083035b609406c1939f6cbb68d42333f140cae815cc36d341b0880de0b6b3a764000080822d46a011d708c9d53a5e7e9195c32fab4f6f3cad259887436eadd521d93ac853541455a0176061761d6d14c063eb2b0c359457dec982d72d52f19bdf33fa8f5be20ed939"],
"method": "eth_sendRawTransaction"
} Error: VM Exception while processing transaction: revert

Uncaught (in promise) Error: Error: Error: [ethjs-rpc] rpc error with payload  Error: VM Exception while processing transaction: revert

Solution send scheint eine Art reserviertes Wort oder Funktion zu sein, die überschrieben wurde. Ich habe den Funktionsnamen in sendMoneyund alle Vorschläge von @Jaime geändert, die meine Probleme behoben haben.

Antworten (1)

Der Fehler ist, dass Ihr Vertrag keinen Ether empfangen kann, da er keine Fallback-Funktion hat. Fügen Sie einfach dies hinzu:

function () public payable{
}

Dadurch kann Ihr Vertrag Ether akzeptieren.

Eine andere Sache ist, dass Sie in Ihrer Sendefunktion Folgendes haben:

msg.sender.transfer(msg.value);

sollte aber sein

 _receiver.transfer(msg.value);

Außerdem ist nicht klar, was Sie in Ihrem js-Code versuchen, versuchen Sie, Ether an den Vertrag zu senden, oder versuchen Sie, die Funktion „Senden“ zu verwenden?

Im ersten Fall (Senden von Ether an die Vertragsnutzung):

web3.eth.sendTransaction({....})

Im zweiten Fall (versuchen, die Sendefunktion in Ihrem Vertrag zu verwenden) können Sie mit Ihrer Vertragsinstanz als „contractInstance“ so etwas tun:

var account = web3.eth.accounts[0]; 
var mycontract = web3.eth.contract(ABI);
var contractInstance = mycontract.at('contractaddress...')
contractInstance.send('0x...',{'value':web3.toWei(myvalue,'ether')} function(err,res){
        if(err){
            console.log('transaction failed')
        }
    })

hoffe das hilft

Bitte sehen Sie sich mein Update an, da auch in Ihrem js-Code nicht klar ist, was Sie versuchen zu tun. Ich habe eine Erklärung hinzugefügt, ob Sie Ether an den Vertrag senden möchten oder ob Sie die Funktion "Senden" Ihres Vertrags verwenden möchten.
Danke noch einmal. Ich habe versucht, einen Vertrag zu erstellen, der es mir ermöglicht, Ether an eine andere Adresse zu senden, bin aber im Kreis herumgegangen und habe verschiedene Dinge ausprobiert, nachdem ich den obskuren Fehler erhalten habe.
Wie würden Sie bei Ihrem zweiten Beispiel hinzufügen msg.value, dass ich scheinbar eine wahnsinnig hohe Zahl bekomme, wenn ich versuche, es so zu nennen:instance.send('0xf17f52151EbEF6C7334FAD080c5704D77216b732', {value: this.state.web3.toWei(1, 'ether')}, function(err,res){ if(err){ console.log('transaction failed'); console.log(err); } console.log(res); })
Was ist der wahnsinnig hohe Wert? Wenn Sie 1 Ether einstellen, sind das 100000000000000000 Wei.
mit dem obigen Code öffnet sich MetaMask und gibt einen Fehler wegen unzureichender Mittel aus und denkt, ich versuche zu senden:$3.945581176514035e+32 ♦ 1.378706120803003e+30
Geben Sie zum Testen den Wert direkt auf wei: 1000000000000000000. Ich hoffe, die Instanz ist korrekt. Ich habe die Antwort aktualisiert, um zu zeigen, wie ich normalerweise Instanzen des Vertrags in js erstelle. Lassen Sie mich wissen, wie es geht.