Skip to content

Instantly share code, notes, and snippets.

@jdmedeiros
Last active December 1, 2020 01:28
Show Gist options
  • Save jdmedeiros/9e1452a0f73d9dca4766e8b8f82469cc to your computer and use it in GitHub Desktop.
Save jdmedeiros/9e1452a0f73d9dca4766e8b8f82469cc to your computer and use it in GitHub Desktop.
Eleição do delegado de turma do curso GRSI 2020/2021 na ENTA - Escola de Novas Tecnologias dos Açores usando o Ethereum blockchain
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;
// https://kovan.etherscan.io/address/0x18c0417f85ae320d35138b0bb289532156a92356
contract ElegerDelegado {
string[15] nomes;
struct Eleitor {
uint autorizado;
bool votou;
}
struct Candidato {
string nome;
uint votos;
}
address formador;
mapping(address => Eleitor) eleitores;
Candidato[15] public candidatos;
constructor() {
nomes[0] = "Alexandre";
nomes[1] = "Bruno";
nomes[2] = "Carlos";
nomes[3] = "Carreira";
nomes[4] = "Freitas";
nomes[5] = "Mendonca";
nomes[6] = "Edgar";
nomes[7] = "Francisco";
nomes[8] = "Goncalo";
nomes[9] = "Henrique";
nomes[10] = "Joao";
nomes[11] = "Leandro";
nomes[12] = "Messias";
nomes[13] = "Roberto";
nomes[14] = "Ruben";
formador = msg.sender;
eleitores[formador].autorizado = 1;
for (uint i = 0; i < nomes.length; i++) {
candidatos[i].nome = nomes[i];
candidatos[i].votos = 0;
}
autorizarEleitor(0xFd7F22da2928a57968B783a82Df8EebFccBB5bCE);
autorizarEleitor(0x6d2313648035d5080014839f3059E6dB12F492e0);
autorizarEleitor(0x16cD420a18AaF2f4B7E5E9409c7eB30fF59E89c4);
autorizarEleitor(0x935162877B880b26bdE2454B9dEB9eb40fc28585);
autorizarEleitor(0xB335ff85539011d6d23540535F32C2ac07f740E6);
autorizarEleitor(0xb499e4ADa0B3158181a36ca99F54D2e24F6cE0E0);
autorizarEleitor(0xBa473b1e76727252E6D582f8d3143bDd36DA7f8e);
autorizarEleitor(0xe96Bc7dfCbEce412844a6061cd4cC3Af15fD4897);
autorizarEleitor(0x2D268DD4c8D3863759215D9244DF632c76F4db74);
autorizarEleitor(0x1db8FFEf75e93c1F72487CC9F2EeF0dc69072DAd);
autorizarEleitor(0xF8963e9B8F2E8201758E58d89C7b3d7f3e66f12e);
autorizarEleitor(0xd10D34bc328161b11da26ea464D51aA5cF171047);
autorizarEleitor(0x83782A472E9636ca7a4BBC41b9B45FDAa609Cd51);
autorizarEleitor(0x4dCA4C4392A52b87BA18fDa072C8c830B1c0D3e3);
autorizarEleitor(0xCEA1A0bae978566c8d9701872C98c47169176f6e);
autorizarEleitor(0xAb61f978367b601db3d0899429aCcAB2A5319De7);
}
function autorizarEleitor(address oEleitor) private {
eleitores[oEleitor].autorizado = 1;
}
function votar(string memory candidato) public {
uint idxCandidato = validarCandidato(candidato);
Eleitor storage remetente = eleitores[msg.sender];
require(remetente.autorizado != 0, unicode"Não está autorizado a votar.");
require(!remetente.votou, unicode"Eleitor já votou.");
require(
idxCandidato < nomes.length,
string(abi.encodePacked("Candidato '", candidato, "' inexistente!"))
);
remetente.votou = true;
candidatos[idxCandidato].votos += remetente.autorizado;
}
function validarCandidato(string memory oCandidato) private view returns(uint) {
uint i;
for (i = 0; i < nomes.length; i++) {
if (keccak256(abi.encodePacked(nomes[i])) == keccak256(abi.encodePacked(oCandidato))) {
return i;
}
}
return i;
}
function resultados() public view
returns(string memory vencedor) {
vencedor = candidatos[0].nome;
uint quantosVotos = candidatos[0].votos;
for (uint p = 1; p < candidatos.length; p++) {
if (candidatos[p].votos > quantosVotos) {
quantosVotos = candidatos[p].votos;
vencedor = candidatos[p].nome;
}
else if (candidatos[p].votos == quantosVotos) {
vencedor = unicode"Há mais do que um candidato com o mesmo número de votos!";
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment