MetaMaskでContractにETHを送金できなかった
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は例で付けているだけだけど、中身を{}
にするとエラーが出そうだったし、こうした。
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).
参考
Discussion