-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathLottery.sol
101 lines (83 loc) · 2.7 KB
/
Lottery.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//SPDX-License-Identifier:MIT
pragma solidity ^0.8.0;
contract Lottery {
address public owner;
address payable[] public playersA;
address payable[] public playersB;
address payable[] public playersC;
uint8 public usersA;
uint8 public usersB;
uint8 public usersC;
function getBalance() public view returns (uint) {
return address(this).balance;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
function enter(uint _value) public payable {
if (_value == 1){
require(msg.value >= 1 ether);
// address of player entering lottery
playersA.push(payable(msg.sender));
usersA +=1;
results();
}
else if (_value == 2){
require(msg.value >= 5 ether);
// address of player entering lottery
playersB.push(payable(msg.sender));
usersB +=1;
results();
}
else {
require(msg.value >= 10 ether);
// address of player entering lottery
playersC.push(payable(msg.sender));
usersC +=1;
results();
}
}
function getRandomNumber() public view returns (uint) {
return uint(keccak256(abi.encodePacked(owner, block.timestamp)));
}
function results() internal{
if (usersA == 10){
pickWinnerA();
}
else if (usersB == 10){
pickWinnerB();
}
else if (usersC == 10){
pickWinnerC();
}
}
function pickWinnerA() internal {
uint index = getRandomNumber() % playersA.length;
(bool sent, ) = playersA[index].call{value: 8 ether}("");
require(sent, "Failed to send Crypto");
// reset the state of the contract
playersA = new address payable[](0);
usersA = 0;
}
function pickWinnerB() internal {
uint index = getRandomNumber() % playersB.length;
(bool sent, ) = playersB[index].call{value: 45 ether}("");
require(sent, "Failed to send Crypto");
// reset the state of the contract
playersB = new address payable[](0);
usersB = 0;
}
function pickWinnerC() internal {
uint index = getRandomNumber() % playersC.length;
// reset the state of the contract
(bool sent, ) = playersC[index].call{value: 100 ether}("");
require(sent, "Failed to send Crypto");
playersC = new address payable[](0);
usersC = 0;
}
function withdraw() public payable onlyOwner {
(bool s, ) = payable(msg.sender).call{value: address(this).balance}("");
require(s);
}
}