отправить Ethereum на смарт-контакт с помощью web3.js [метамаска]

эта функция:

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

полностью работает для отправки ETH из ethereum-acount-addressв ethereum-acount-addressНО, когда я устанавливаю адрес смарт-контракта для toaddressвозврата метамаски

Transaction Error. Exception thrown in contract code.

мой контракт солидности

pragma solidity ^0.4.17;

contract mysmartContract{


        function whitdrawETH() payable public {

        }

        function getContactEthBalance() constant returns(uint) {

        return this.balance;
        }

    }

Ответы (2)

Чтобы сделать смарт-контракт приемлемым для эфира, вам необходимо реализовать резервную функцию :

function() public payable { }

Контракты, которые получают эфир напрямую (без вызова функции, то есть с помощью отправки или передачи), но не определяют резервную функцию, выдают исключение, отправляя эфир обратно (до Solidity v0.4.0 это было иначе). Поэтому, если вы хотите, чтобы ваш контракт получал эфир, вы должны реализовать резервную функцию.

Если вы хотите отправить эфир в свой смарт-контракт mysmartContractс whitdrawETH()функцией, вам нужно отправить methodSignature этой функции в поле данных следующим образом:

web3.eth.sendTransaction({
   from: myaddress,
   to: toaddress,
   data: web3.eth.abi.encodeFunctionSignature('whitdrawETH()')
   value: web3.toWei(1, "ether")
}
web3.eth.abiбольше не существует в MetaMask. Кажется, он переехал в другое место.
Функции @user2284570 web3.eth.abiявляются частью web3@1.x.x: web3js.readthedocs.io/en/v1.2.0/web3-eth-abi.html . Видимость этих функций зависит от версии библиотеки web3, которую вы используете в своем Dapp. Метамаск не имеет к этому никакого отношения.

Вот что сработало для меня:

receive() external payable { }

Это функция, которая выполняется при передаче простого эфира (например, через .send() или .transfer()). Если такой функции не существует, но существует оплачиваемая резервная функция, эта резервная функция будет вызываться при передаче простого эфира. Если нет ни функции получения эфира, ни подлежащей оплате резервной функции, контракт не может получать эфир посредством обычных транзакций и выдает исключение.

Дополнительная информация здесь: https://docs.soliditylang.org/en/v0.6.2/contracts.html#receive-ether-function