-
Notifications
You must be signed in to change notification settings - Fork 609
/
Copy pathCasino.sol
95 lines (82 loc) · 2.64 KB
/
Casino.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
pragma solidity ^0.4.0;
contract Casino {
uint private start;
uint private buyPeriod = 1000;
uint private verifyPeriod = 100;
uint private checkPeriod = 100;
mapping(address => uint) private _tickets;
mapping(address => uint) private _winnings;
address[] _entries;
address[] _verified;
uint private winnerSeed;
bool private hasWinner;
address private winner;
function Casino()
public {
start = block.timestamp;
}
/**
* This should NOT be part of the contract!!
*/
function unsafeEntry(uint number, uint salt)
public
payable
returns (bool) {
return buyTicket(generateHash(number, salt));
}
function generateHash(uint number, uint salt)
public
pure
returns (uint) {
return uint(keccak256(number + salt));
}
function buyTicket(uint hash)
public
payable
returns (bool) {
// Within the timeframe
require(block.timestamp < start+buyPeriod);
// Correct amount
require(1 ether == msg.value);
// 1 entry per address
require(_tickets[msg.sender] == 0);
_tickets[msg.sender] = hash;
_entries.push(msg.sender);
return true;
}
function verifyTicket(uint number, uint salt)
public
returns (bool) {
// Within the timeframe
require(block.timestamp >= start+buyPeriod);
require(block.timestamp < start+buyPeriod+verifyPeriod);
// Has a valid entry
require(_tickets[msg.sender] > 0);
// Validate hash
require(salt > number);
require(generateHash(number, salt) == _tickets[msg.sender]);
winnerSeed = winnerSeed ^ salt ^ uint(msg.sender);
_verified.push(msg.sender);
}
function checkWinner()
public
returns (bool) {
// Within the timeframe
require(block.timestamp >= start+buyPeriod+verifyPeriod);
require(block.timestamp < start+buyPeriod+verifyPeriod+checkPeriod);
if (!hasWinner) {
winner = _verified[winnerSeed % _verified.length];
_winnings[winner] = _verified.length-10 ether;
hasWinner = true;
}
return msg.sender == winner;
}
function claim()
public {
// Has winnings to claim
require(_winnings[msg.sender] > 0);
uint claimAmount = _winnings[msg.sender];
_winnings[msg.sender] = 0;
msg.sender.transfer(claimAmount);
}
}