-
Notifications
You must be signed in to change notification settings - Fork 21
/
CoinFlip.sol
146 lines (119 loc) · 3.92 KB
/
CoinFlip.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/**
* CoinFlip
*
* Juego de casino para apostar a cara o cruz. Se usa el timestamp del bloque de la blockchain
* para simular un número random entre 0 y 1. Si el timestamp del bloque es un número par el
* usuario gana el 190% del dinero invertido, si es un número impar pierde los ethers jugados.
*
* Al desplegar el contrato es necesario transferirle fondos para que pueda pagar el premio si
* el usuario gana.
*
* Versión modificada para interfaz web
*
**/
pragma solidity ^0.4.0;
contract CoinFlip {
address owner;
uint payPercentage = 90;
// Maximum amount to bet in WEIs
uint public MaxAmountToBet = 200000000000000000; // = 0.2 Ether
struct Game {
address addr;
uint blocknumber;
uint blocktimestamp;
uint bet;
uint prize;
bool winner;
}
Game[] lastPlayedGames;
Game newGame;
event Status(
string _msg,
address user,
uint amount,
bool winner
);
function CoinFlip() payable {
owner = msg.sender;
}
modifier onlyOwner() {
if (owner != msg.sender) {
revert();
} else {
_;
}
}
function Play() payable {
if (msg.value > MaxAmountToBet) {
revert();
} else {
if ((block.timestamp % 2) == 0) {
if (this.balance < (msg.value * ((100 + payPercentage) / 100))) {
// No tenemos suficientes fondos para pagar el premio, así que transferimos todo lo que tenemos
msg.sender.transfer(this.balance);
Status('Congratulations, you win! Sorry, we didn\'t have enought money, we will deposit everything we have!', msg.sender, msg.value, true);
newGame = Game({
addr: msg.sender,
blocknumber: block.number,
blocktimestamp: block.timestamp,
bet: msg.value,
prize: this.balance,
winner: true
});
lastPlayedGames.push(newGame);
} else {
uint _prize = msg.value * (100 + payPercentage) / 100;
Status('Congratulations, you win!', msg.sender, _prize, true);
msg.sender.transfer(_prize);
newGame = Game({
addr: msg.sender,
blocknumber: block.number,
blocktimestamp: block.timestamp,
bet: msg.value,
prize: _prize,
winner: true
});
lastPlayedGames.push(newGame);
}
} else {
Status('Sorry, you loose!', msg.sender, msg.value, false);
newGame = Game({
addr: msg.sender,
blocknumber: block.number,
blocktimestamp: block.timestamp,
bet: msg.value,
prize: 0,
winner: false
});
lastPlayedGames.push(newGame);
}
}
}
function getGameCount() public constant returns(uint) {
return lastPlayedGames.length;
}
function getGameEntry(uint index) public constant returns(address addr, uint blocknumber, uint blocktimestamp, uint bet, uint prize, bool winner) {
return (lastPlayedGames[index].addr, lastPlayedGames[index].blocknumber, lastPlayedGames[index].blocktimestamp, lastPlayedGames[index].bet, lastPlayedGames[index].prize, lastPlayedGames[index].winner);
}
function depositFunds(uint amount) onlyOwner payable {
if (owner.send(amount)) {
Status('User has deposit some money!', msg.sender, msg.value, true);
}
}
function withdrawFunds(uint amount) onlyOwner {
if (owner.send(amount)) {
Status('User withdraw some money!', msg.sender, amount, true);
}
}
function setMaxAmountToBet(uint amount) onlyOwner returns (uint) {
MaxAmountToBet = amount;
return MaxAmountToBet;
}
function getMaxAmountToBet(uint amount) constant returns (uint) {
return MaxAmountToBet;
}
function Kill() onlyOwner {
Status('Contract was killed, contract balance will be send to the owner!', msg.sender, this.balance, true);
selfdestruct(owner);
}
}