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 sendMoney
y todas las sugerencias de @Jaime que solucionaron mis problemas.
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
Jaime
kai
kai
msg.value
Parece 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); })
Jaime
kai
$3.945581176514035e+32 ♦ 1.378706120803003e+30
Jaime
kai