Reputation: 237
Using Solidity ^0.5.0, I'm actually trying to implement an old code working in ^0.4.17, but it throws an error on Remix. I checked syntax and everything but just can't catch what's wrong. Any help highly appreciated.
pragma solidity ^0.5.0;
contract Lottery{
address public manager;
address[] public players;
constructor() public {
manager = msg.sender;
}
function participate() public payable {
require(msg.value > .01 ether);
players.push(msg.sender);
}
function pseudoRandom() private view returns(uint){
return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
}
function pickWinner() public {
uint index = pseudoRandom() % players.length;
players[index].transfer(address(this).balance);
}
}
Here is the error message:
browser/Lottery.sol:22:8: TypeError: Member "transfer" not found or not visible after argument-dependent lookup in address.
players[index].transfer(address(msg.sender).balance);
^---------------------^
Upvotes: 6
Views: 8631
Reputation: 747
This is how overall contract code looks like
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.9;
contract Lottery {
address public manager;
address payable[] public players;
constructor() { }
function lottery() public {
manager = msg.sender;
}
function enter() public payable {
require(msg.value > .01 ether);
players.push(payable(msg.sender));
}
function random() public view returns (uint8) {
return uint8(uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty, players)))%251);
}
function pickWinner() public {
uint index = random() % players.length;
players[index].transfer(address(this).balance);
}
}
Upvotes: 0
Reputation: 31
As far as I understood from your contract's business logic, all addresses enter the lottery wouldn't win a price, so you don't need to make all addresses payable. Better way is making only the winner address payable by casting address type to a payable address as below.
address payable winnerAddress = payable(players[index]);
winnerAddress.transfer(address(this).balance);
Upvotes: 0
Reputation: 378
Please see Solidity v0.5.0 Breaking Changes.
As pointed out here:
The address type was split into address and address payable, where only address payable provides the transfer function.
See my answer here for more details.
Change this line:
address[] public players;
To this:
address payable[] public players;
EDIT
Thanks smarx! 😄
Upvotes: 7
Reputation: 31
You are missing the payable modifier on the initial declaration. Change
address[] public players;
to
address payable[] public players;
Upvotes: 3