28 Payable
payable として宣言された関数、アドレスは native token(イーサリアムの場合はイーサ)の受信ができ、コントラクトに保存できるようになる
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Payable {
// Payableをつけたアドレスはイーサを受け取れる
address payable public owner;
// Payableをつけることで、デプロイ時に呼び出されるconstructorを経由してコントラクトはイーサを受け取れる
constructor() payable {
owner = payable(msg.sender);
}
// イーサをコントラクトにデポジットするための関数
// 関数を呼び出すとともに、イーサを送付すると
// コントラクトのイーサのバランスが増加する
function deposit() public payable {}
// 関数を呼び出すとともにイーサを送付すると
// エラーになる。なぜなら、payableのキーワードがないから
function notPayable() public {}
// コントラクトからイーサを引き出す用の関数
function withdraw() public {
// コントラクトにあるイーサを変数に保存し
uint amount = address(this).balance;
// すべてのイーサをオーナーへ送金
// オーナーがイーサの送金先のため、見ての通りpayableというワードがつけられている
// ("")はデータを送りたいときに埋めるところなので、イーサを送るだけだといらないから空っぽにしている→最初はまだ理解しなくてよい
(bool success, ) = owner.call{value: amount}("");
require(success, "Failed to send Ether");
}
// イーサを_toアドレスへ送付するための関数
// 見ての通り、引数である_toアドレスはpayableがつけられている
function transfer(address payable _to, uint _amount) public {
(bool success, ) = _to.call{value: _amount}("");
require(success, "Failed to send Ether");
}
}
Remixで試す