У меня есть контракт Solidity, который предназначен для отправки эфира кому-то. К сожалению, это дает мне загадочное сообщение об ошибке после подтверждения транзакции в MetaMask.
Я тестирую локальную сеть ethereum, работающую на ганаше, и проект был создан с использованием трюфельного ящика с реакцией.
Договор:
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);
})
})
})
};
Сообщение об ошибке
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
Отправка решения кажется каким-то зарезервированным словом или функцией, которая была переопределена. Я изменил имя функции на sendMoney
и все предложения от @Jaime, которые исправили мои проблемы.
Ошибка в том, что ваш контракт не может получить эфир, потому что у него нет резервной функции. Просто добавьте к нему это:
function () public payable{
}
Это позволит вашему контракту принимать эфир.
Другое дело, что в вашей функции отправки у вас есть:
msg.sender.transfer(msg.value);
но должно быть
_receiver.transfer(msg.value);
Кроме того, неясно, что вы пытаетесь сделать в своем js-коде, вы пытаетесь отправить эфир на контракт или пытаетесь использовать функцию «отправить»?
В первом случае (отправка эфира в пользование контракта):
web3.eth.sendTransaction({....})
Во втором случае (пытаясь использовать функцию отправки в вашем контракте), имея экземпляр контракта как «contractInstance», вы можете сделать что-то вроде этого:
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')
}
})
надеюсь это поможет
Хайме
Кай
Кай
msg.value
я, кажется, получаю какое-то безумно большое число, если попытаюсь назвать это так: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); })
Хайме
Кай
$3.945581176514035e+32 ♦ 1.378706120803003e+30
Хайме
Кай