概要
- Solidity 0.5.0 からは、Ether を受け取ることのアドレスの型を
address payableとする必要があります。 - Solidity 0.4.0 までと同様に普通の
address型を使用するとコンパイル時にエラーとなります。
サンプルコード(0.4系で動くコード)
- tipEther メソッドは、関数を実行する際に送った Ether を beneficiary に送ります。
pragma solidity ^0.4.25;
contract AddressPayableTest {
address beneficiary = 0x0089d53F703f7E0843953D48133f74cE247184c2;
function tipEther() public payable {
beneficiary.transfer(msg.value);
}
}
- 上記のコードは、Solidity 0.4 系までは動きますが、Solidity 0.5 系だと次のメッセージと共にコンパイルエラーとなります。
Member function “transfer” not found or not visible after argument-dependent lookup in contract?
サンプルコード(0.5系で動くコード)
- tipEther メソッドは、関数を実行する際に送った Ether を beneficiary に送ります。
- beneficiary は Ether を transfer メソッドによって受け取るため、
addressではなくaddress payableとします。
pragma solidity ^0.5.0;
contract AddressPayableTest {
address payable beneficiary = 0x0089d53F703f7E0843953D48133f74cE247184c2;
function tipEther() public payable {
beneficiary.transfer(msg.value);
}
}
注意
- 基本的には
address payableはなるべく使用せず、特定のアドレスに対して Ether を送金する場合は、withdrawal パターン を使用すべきだと思います。 -
msg.senderはaddress payableなので、普通に withdrawal に従えば、address payableについては意識する必要がないと思います。