Senden Sie Ethereum an Smart Contact mit web3.js [Metamaske]

diese Funktion:

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

vollständig für das Senden von ETH von ethereum-acount-addressan , ABER wenn ich eine Smartcontract- Adresse für die Metamaskenrückgabe ethereum-acount-addressfestlegetoaddress

Transaction Error. Exception thrown in contract code.

mein Soliditätsvertrag ist

pragma solidity ^0.4.17;

contract mysmartContract{


        function whitdrawETH() payable public {

        }

        function getContactEthBalance() constant returns(uint) {

        return this.balance;
        }

    }

Antworten (2)

Um Smart-Contract für Ether akzeptabel zu machen, müssen Sie die Fallback-Funktion implementieren :

function() public payable { }

Verträge, die Ether direkt empfangen (ohne Funktionsaufruf, dh mit send oder transfer), aber keine Fallback-Funktion definieren, lösen eine Ausnahme aus und senden den Ether zurück (dies war vor Solidity v0.4.0 anders). Wenn Sie also möchten, dass Ihr Vertrag Ether empfängt, müssen Sie eine Fallback-Funktion implementieren.

Falls Sie Ether an Ihren Smart-Contract mysmartContractmit whitdrawETH()Funktion senden möchten, müssen Sie methodSignature dieser Funktion wie folgt an ein Datenfeld senden:

web3.eth.sendTransaction({
   from: myaddress,
   to: toaddress,
   data: web3.eth.abi.encodeFunctionSignature('whitdrawETH()')
   value: web3.toWei(1, "ether")
}
web3.eth.abiexistiert mit MetaMask nicht mehr. Es scheint, dass es woanders hingezogen ist.
@user2284570 web3.eth.abiFunktionen sind Teil von web3@1.x.x: web3js.readthedocs.io/en/v1.2.0/web3-eth-abi.html . Die Sichtbarkeit dieser Funktionen bezieht sich auf die Version der web3-Bibliothek, die Sie in Ihrem Dapp verwenden. Metamask hat damit nichts zu tun.

Das hat bei mir funktioniert:

receive() external payable { }

Dies ist die Funktion, die bei reinen Ether-Transfers ausgeführt wird (z. B. über .send() oder .transfer()). Wenn keine solche Funktion existiert, aber eine kostenpflichtige Fallback-Funktion existiert, wird die Fallback-Funktion bei einer einfachen Ether-Übertragung aufgerufen. Wenn weder eine Ether-Empfangs- noch eine zahlbare Fallback-Funktion vorhanden ist, kann der Vertrag Ether nicht durch reguläre Transaktionen empfangen und löst eine Ausnahme aus.

Weitere Informationen hier: https://docs.soliditylang.org/en/v0.6.2/contracts.html#receive-ether-function