Payable
payable修飾子について学習します
ETHの送受信はデフォルトで制限されており、payable修飾子を明示的に付与することで可能になります
EOAからEOAへの送信
walletを用いて送信する
EOAからコントラクトへの送信
関数への送信
関数ごとに受信できるかどうかをpayable修飾子で明示する
payableでない関数に0より大きいmsg.valueを設定するとエラーになる
contract PayableSample {
uint balance;
// payable
// msg.balance can be over 0
function payableFunction() external payable {
balance += msg.value;
}
// not payable
// msg.balance can be only 0
function nonPayableFunction() external {
balance += msg.value;
}
}
コントラクト自体への送信
Receive,Fallbackで解説する
コントラクトからの送信
address変数の宣言時にpayableを付与する、または一時的にpayable化することで送信が可能になる
EOA, コントラクト自体への送信
contract PayableSample {
// declare global payable valiable;
address payable a;
// able to declare in function parameter
function payableFunction(address payable b) {
// declare local payable valiable;
address payable c;
address d;
// temprary treat as payable
payable(d).transfer(1 ether);
// payable variable should hold payable value
a = payable(address(0xabc...));
}
}
関数への送信
関数を呼ぶと同時にそのコントラクトに対してmsg.valueを設定することもできる
この時、必要となるETHはEOAではなく関数を呼び出すコントラクトの残高を参照する
function payAndCallFunction() {
PayableSample.payableFunction{value: amount}();
}