25

Got address from 3rd-party library:

address wallet = rlp[5].toAddress();

And wanna transfer some funds to it:

wallet.transfer(amount);

Got error:

TypeError: Member "transfer" not found or not visible after argument-dependent lookup in address.
        wallet.transfer(amount);
        ^-------------^

And casts not works:

((address payable)(wallet)).transfer(amount);
k06a
  • 3,016
  • 2
  • 21
  • 35

2 Answers2

39

Solidity 0.6.x:

Here is how to cast address to address payable:

address addr = 0x****;
address payable wallet = payable(addr);

And contract cast to address payable:

MyContract addr = MyContract(0x****);
address payable wallet = payable(address(addr));

Solidity 0.5.x:

Here is how to cast address to address payable:

address addr = 0x****;
address payable wallet = address(uint160(addr));

And contract cast to address payable:

MyContract addr = MyContract(0x****);
address payable wallet = address(uint160(address(addr)));
k06a
  • 3,016
  • 2
  • 21
  • 35
  • 1
    This worked, thank you. But I don't know why or understand how it works. Seems really janky, is there no other way to do it? – NYC Tech Engineer Feb 20 '20 at 23:22
  • 1
    @NYCTechEngineer, in Solidity 0.6.0, you can now just do payable(addr) to convert an address to an address payable. See https://solidity.readthedocs.io/en/v0.6.0/types.html#address. – erwaman Apr 24 '20 at 16:26
  • All I get is ParserError: Hexadecimal digit missing or invalid. Sol 0.5.16. – Joe Molnar Sep 06 '21 at 23:51
4

In Solidity ^0.6.0, you can just use payable(addr). Ref: https://solidity.readthedocs.io/en/v0.6.0/types.html#address

erwaman
  • 141
  • 2