-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lottery.sol
125 lines (99 loc) · 3.66 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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
pragma solidity ^0.4.10;
contract Lottery {
struct TicketHolder {
address _holderAddress;
uint _numTickets;
}
//----------Variables------------
// Mapping of tickets issued to each address
mapping (address => uint) public ticketHolders;
address[] public holders;
// Array of previous winners.
// TODO: Only hold last 10 winners
address[] public prevWinners;
// Winner of the current lottery
address public winner;
// Total number of tickets issued
uint public ticketsIssued;
// Total balance of the smart contract
uint public contractBalance;
// When the lottery started
uint public lotteryStart;
// Duration the lottery will be active for
uint public lotteryDuration;
// Flag that the lottery is now over
bool public lotteryEnded;
// Total Eth that has been won from users using the contract
uint public totalEthWon;
//----------Events---------------
// Event for when tickets are bought
event TicketsBought(address indexed _from, uint _quantity);
// Event for declaring the winner
event AwardWinnings(address _to, uint _winnings);
// Event for lottery reset
event ResetLottery();
//---------Modifiers---------------
// Checks if still in lottery contribution period
modifier lotteryOngoing() {
require(now < lotteryStart + lotteryDuration);
_;
}
// Checks if lottery has finished
modifier lotteryFinished() {
require(now > lotteryStart + lotteryDuration);
_;
}
//---------Functions----------------
//Create the lottery, each one lasts for 2 minutes
function Lottery() public {
ticketsIssued = 0;
lotteryStart = now;
// lotteryDuration = 1 hours;
lotteryDuration = 2 minutes;
}
// Fallback function calls buyTickets
function () public payable {
buyTickets();
}
// Award users tickets for eth, 1 finney = 1 ticket
function buyTickets() public payable lotteryOngoing returns (bool success) {
ticketHolders[msg.sender] = msg.value / (10**15);
ticketsIssued += ticketHolders[msg.sender];
holders.push(msg.sender);
contractBalance += msg.value;
emit TicketsBought(msg.sender, ticketHolders[msg.sender]);
return true;
}
// After winners have been declared and awarded, clear the arrays and reset the balances
function resetLottery() public lotteryFinished returns (bool success) {
lotteryEnded = false;
lotteryStart = now;
// lotteryDuration = 24 hours;
lotteryDuration = 2 minutes;
emit ResetLottery();
return true;
}
// This will distribute the correct winnings to each winner
function awardWinnings(address _winner) internal lotteryOngoing returns (bool success) {
_winner.transfer(contractBalance);
emit AwardWinnings(_winner, contractBalance);
contractBalance = 0;
resetLottery();
return true;
}
//Generate the winners by random using tickets bought as weight
function generateWinners() public lotteryFinished returns (uint winningTicket) {
//Need to make this truly random - This is temp solution for testing
uint randNum = uint(block.blockhash(block.number - 1)) % ticketsIssued + 1;
winner = holders[randNum];
prevWinners.push(winner);
awardWinnings(winner);
return randNum;
}
function getTicketBalance(address _account) public constant returns (uint balance) {
return ticketHolders[_account];
}
function getBalance() public constant returns (uint) {
return address(this).balance;
}
}