-
Notifications
You must be signed in to change notification settings - Fork 6
/
GuardaLoteria_mapping.sol
121 lines (93 loc) · 3.35 KB
/
GuardaLoteria_mapping.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
pragma solidity ^0.4.0;
contract Loteria {
address dono;
string nomeDoDono;
uint inicio;
struct Sorteio {
uint data;
uint numeroSorteado;
address remetente;
uint countPalpites;
}
Sorteio[] sorteios;
mapping (address => uint) palpites;
address[] palpiteiros;
address[] ganhadores;
constructor(string _nome) public {
dono = msg.sender;
nomeDoDono = _nome;
inicio = now;
}
modifier apenasDono() {
require (msg.sender == dono, "Apenas o dono do contrato pode fazer isso");
_;
}
modifier excetoDono() {
require (msg.sender != dono, "O dono do contrato não pode fazer isso");
_;
}
event TrocoEnviado(address pagante, uint troco);
event PalpiteRegistrado(address remetente, uint palpite);
function enviarPalpite(uint palpiteEnviado) payable public { // excetoDono() {
require (palpiteEnviado >= 1 && palpiteEnviado <= 4, "Você tem que escolher um número entre 1 e 4");
require (palpites[msg.sender] == 0, "Apenas um palpite pode ser enviado por sorteio");
require (msg.value >= 1000 wei, "A taxa para palpitar é 1000 wei");
// calcula e envia troco
uint troco = msg.value - 1000 wei;
if (troco > 0){
msg.sender.transfer(troco);
emit TrocoEnviado(msg.sender, troco);
}
// registra o palpite
palpites[msg.sender] = palpiteEnviado;
palpiteiros.push(msg.sender);
emit PalpiteRegistrado(msg.sender, palpiteEnviado);
}
function verificarMeuPalpite() view public returns(uint palpite) {
require (palpites[msg.sender] > 0, "Você não tem palpite ainda para esse sorteio");
return palpites[msg.sender];
}
function contarPalpites() view public returns(uint count) {
return palpiteiros.length;
}
event SorteioPostado(uint resultado);
event PremiosEnviados(uint premioTotal, uint premioIndividual);
function sortear() public apenasDono() returns(uint8 _numeroSorteado) {
require (now > inicio + 1 minutes, "O sorteio só pode ser feito depois de um intervalo de 1 minuto");
require (palpiteiros.length >= 1, "Um mínimo de 1 pessoa é exigida para poder sortear");
// sortear um número
uint8 numeroSorteado = uint8(keccak256(abi.encodePacked(blockhash(block.number-1))))/64+1; // 1-4
sorteios.push(Sorteio({
data: now,
numeroSorteado: numeroSorteado,
remetente: msg.sender,
countPalpites: palpiteiros.length
}));
emit SorteioPostado(numeroSorteado);
// procura os ganhadores
for (uint p = 0; p < palpiteiros.length; p++) {
address palpiteiro = palpiteiros[p];
if (palpites[palpiteiro] == numeroSorteado){
ganhadores.push(palpiteiro);
}
delete palpites[palpiteiro];
}
uint premioTotal = address(this).balance;
if (ganhadores.length > 0) {
uint premio = premioTotal / ganhadores.length;
// envia os premios
for (p = 0; p < ganhadores.length; p++) {
ganhadores[p].transfer(premio);
}
emit PremiosEnviados(premioTotal, premio);
}
// resetar o sorteio
delete palpiteiros;
delete ganhadores;
return numeroSorteado;
}
function kill () public apenasDono() {
dono.transfer(address(this).balance);
selfdestruct(dono);
}
}