Contrato inteligente para enviar ether

Tengo un contrato de Solidity que está destinado a enviar éter a alguien. Desafortunadamente, me está dando un mensaje de error críptico después de confirmar la transacción en MetaMask.

Estoy probando en una red ethereum local que se ejecuta en ganache y el proyecto se creó utilizando una caja de trufas de reacción.

Contrato:

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

};

Mensaje de error

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

El envío de la solución parece ser algún tipo de palabra o función reservada que se estaba anulando. Cambié el nombre de la función a sendMoneyy todas las sugerencias de @Jaime que solucionaron mis problemas.

Respuestas (1)

El error es que su contrato no puede recibir ether porque no tiene una función de respaldo. Solo agrega esto:

function () public payable{
}

Esto permitirá que su contrato acepte ether.

Otra cosa es que en tu función de envío tienes:

msg.sender.transfer(msg.value);

pero debería ser

 _receiver.transfer(msg.value);

Además, no está claro qué está tratando de hacer en su código js, ​​¿está tratando de enviar ether al contrato o está tratando de usar la función 'enviar'?

En el primer caso (enviando ether al uso del contrato):

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

En el segundo caso (tratando de usar la función de envío en su contrato), teniendo su instancia de contrato como 'instancia de contrato' puede hacer algo como esto:

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

espero que esto ayude

Consulte mi actualización, ya que también en su código js no está claro lo que está tratando de hacer. Agregué una explicación si desea enviar ether al contrato, o si desea usar la función 'enviar' de su contrato.
Gracias de nuevo. Estaba tratando de crear un contrato que me permitiera enviar ether a otra dirección, pero di vueltas en círculos intentando diferentes cosas después de recibir el oscuro error.
Con su segundo ejemplo, ¿cómo agregaría el msg.valueParece que estoy obteniendo un número increíblemente alto si intento llamarlo así: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); })
¿cuál es el valor increíblemente alto?, ya que está configurando 1 éter, será 100000000000000000 wei.
con el código anterior MetaMask se abre y da un error sobre fondos insuficientes y piensa que estoy tratando de enviar:$3.945581176514035e+32 ♦ 1.378706120803003e+30
Solo para probar, coloque el valor directamente en wei: 10000000000000000000. Espero que la instancia sea correcta. Actualicé la respuesta para mostrar cómo suelo crear instancias del contrato en js. Déjame saber como va.