enviar Ethereum a contacto inteligente con web3.js [metamask]

esta función :

  web3.eth.sendTransaction({from:myaddress,to:toaddress, value:web3.toWei(1, "ether")}, function(err, transactionHash) {
  if (!err)
    console.log(transactionHash); 
  });

funciona completamente para enviar ETH de ethereum-acount-addressa ethereum-acount-addressPERO cuando configuro una dirección de contrato inteligentetoaddress para la devolución de meta máscara

Transaction Error. Exception thrown in contract code.

mi contrato de solidez es

pragma solidity ^0.4.17;

contract mysmartContract{


        function whitdrawETH() payable public {

        }

        function getContactEthBalance() constant returns(uint) {

        return this.balance;
        }

    }

Respuestas (2)

Para que el contrato inteligente sea aceptable para ether, debe implementar la función de respaldo :

function() public payable { }

Los contratos que reciben Ether directamente (sin una llamada de función, es decir, mediante envío o transferencia) pero que no definen una función de respaldo generan una excepción y devuelven el Ether (esto era diferente antes de Solidity v0.4.0). Entonces, si desea que su contrato reciba Ether, debe implementar una función de respaldo.

En caso de que desee enviar éter a su contrato inteligente mysmartContractcon whitdrawETH()función, debe enviar el método Firma de esta función a un campo de datos como este:

web3.eth.sendTransaction({
   from: myaddress,
   to: toaddress,
   data: web3.eth.abi.encodeFunctionSignature('whitdrawETH()')
   value: web3.toWei(1, "ether")
}
web3.eth.abiya no existe con MetaMask. Parece que se mudó a otra parte.
Las funciones de @user2284570 web3.eth.abison parte de web3@1.x.x: web3js.readthedocs.io/en/v1.2.0/web3-eth-abi.html . La visibilidad de esas funciones se relaciona con la versión de la biblioteca web3 que usa en su Dapp. Metamask no tiene nada que ver con eso.

Esto es lo que funcionó para mí:

receive() external payable { }

Esta es la función que se ejecuta en las transferencias simples de Ether (por ejemplo, a través de .send() o .transfer()). Si no existe tal función, pero existe una función de respaldo pagable, se llamará a la función de respaldo en una transferencia de Ether simple. Si no está presente una función de recepción de Ether ni de reserva pagadera, el contrato no puede recibir Ether a través de transacciones regulares y genera una excepción.

Más información aquí: https://docs.soliditylang.org/en/v0.6.2/contracts.html#receive-ether-function