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 sendMoney
und alle Vorschläge von @Jaime geändert, die meine Probleme behoben haben.
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
Jaime
Kai
Kai
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); })
Jaime
Kai
$3.945581176514035e+32 ♦ 1.378706120803003e+30
Jaime
Kai