эта функция:
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;
}
}
Чтобы сделать смарт-контракт приемлемым для эфира, вам необходимо реализовать резервную функцию :
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")
}
Вот что сработало для меня:
receive() external payable { }
Это функция, которая выполняется при передаче простого эфира (например, через .send() или .transfer()). Если такой функции не существует, но существует оплачиваемая резервная функция, эта резервная функция будет вызываться при передаче простого эфира. Если нет ни функции получения эфира, ни подлежащей оплате резервной функции, контракт не может получать эфир посредством обычных транзакций и выдает исключение.
Дополнительная информация здесь: https://docs.soliditylang.org/en/v0.6.2/contracts.html#receive-ether-function
пользователь 2284570
web3.eth.abi
больше не существует в MetaMask. Кажется, он переехал в другое место.Виктор Баранов
web3.eth.abi
являются частьюweb3@1.x.x
: web3js.readthedocs.io/en/v1.2.0/web3-eth-abi.html . Видимость этих функций зависит от версии библиотеки web3, которую вы используете в своем Dapp. Метамаск не имеет к этому никакого отношения.