メインコンテンツまでスキップ

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}();
}

Reference