Смарт-контракт для отправки эфира

У меня есть контракт 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, которые исправили мои проблемы.

Ответы (1)

Ошибка в том, что ваш контракт не может получить эфир, потому что у него нет резервной функции. Просто добавьте к нему это:

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')
        }
    })

надеюсь это поможет

Пожалуйста, смотрите мое обновление, так как в вашем js-коде неясно, что вы пытаетесь сделать. Я добавил объяснение, если вы хотите отправить эфир в контракт или хотите использовать функцию «отправить» вашего контракта.
Еще раз спасибо. Я пытался создать контракт, который позволял бы мне отправлять эфир на другой адрес, но ходил по кругу, пробуя разные вещи, после того, как получил непонятную ошибку.
Что касается вашего второго примера, как бы вы добавили, что 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); })
что такое безумно высокое значение?, поскольку вы устанавливаете 1 эфир, это будет 1000000000000000000 вей.
с приведенным выше кодом открывается MetaMask и выдает ошибку о недостаточности средств и думает, что я пытаюсь отправить:$3.945581176514035e+32 ♦ 1.378706120803003e+30
Просто для проверки поставьте значение прямо на вей: 10000000000000000000. Надеюсь экземпляр правильный. Я обновил ответ, чтобы показать, как я обычно создаю экземпляры контракта в js. Дайте мне знать, как это происходит.