🎉

MetaMaskでContractにETHを送金できなかった

2022/06/01に公開

MetaMaskから Smart Contract にETHを送金しようとすると「Warning! Error encountered during contract execution [out of gas] 」というエラーでFailした。これはガス代が足りないというエラーだが、明らかにおかしかったので調べたらスマコンは指定しないとETHを受け取れるようにならない。

結論

receive()関数を実装する

event Received(address, uint);
receive() external payable {
	emit Received(msg.sender, msg.value);
}

function() public payable {}を使えとかfallback() external payable {}を使えとかあったけど、receive()がもっともシンプルかつ正しいようだった。eventは例で付けているだけだけど、中身を{}にするとエラーが出そうだったし、こうした。

https://docs.soliditylang.org/en/v0.7.4/contracts.html#receive-ether-function

constructor()にpayable付けても、当然deploy時にしかETHを送金できないので、上記を実装する必要がある。Solidity v0.4.0 から変わった仕様らしい。

Contracts that receive Ether directly (without a function call, i.e. using send or transfer) but do not define a receive Ether function or a payable fallback function throw an exception, sending back the Ether (this was different before Solidity v0.4.0). So if you want your contract to receive Ether, you have to implement a receive Ether function (using payable fallback functions for receiving Ether is not recommended, since it would not fail on interface confusions).

参考

https://ethereum.stackexchange.com/questions/89833/compiler-solc-expected-a-state-variable-declaration

Discussion