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-address
a ethereum-acount-address
PERO 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;
}
}
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 mysmartContract
con 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")
}
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
usuario2284570
web3.eth.abi
ya no existe con MetaMask. Parece que se mudó a otra parte.Víctor Baranov
web3.eth.abi
son parte deweb3@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.