-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
4a1e105
commit 4a1bc55
Showing
7 changed files
with
264 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity >=0.4.21 <0.7.0; | ||
|
||
contract Migrations { | ||
address public owner; | ||
uint public last_completed_migration; | ||
|
||
constructor() public { | ||
owner = msg.sender; | ||
} | ||
|
||
modifier restricted() { | ||
if (msg.sender == owner) _; | ||
} | ||
|
||
function setCompleted(uint completed) public restricted { | ||
last_completed_migration = completed; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
pragma solidity ^0.5.0; | ||
|
||
contract Votacion { | ||
|
||
mapping (bytes32 => uint8) public votosRecibidos; //mapping que asocia numero de votos a candidato | ||
mapping (bytes32 => bool) public candidatos; //mapping para saber si un candidato es válido | ||
|
||
constructor (bytes32[] memory nombreCandidatos) public { | ||
for(uint i = 0; i < nombreCandidatos.length; i++) { | ||
candidatos[nombreCandidatos[i]] = true; | ||
} | ||
} | ||
|
||
// Numero total de votos recibidos por un candidato | ||
function votosTotales(bytes32 candidato) public returns (uint8) { | ||
require(candidatoEsValido(candidato)); | ||
return votosRecibidos[candidato]; | ||
} | ||
|
||
// Incrementa en 1 el numero de votos de un candidato | ||
function votar(bytes32 candidato) public { | ||
require(candidatoEsValido(candidato)); | ||
votosRecibidos[candidato] += 1; | ||
} | ||
|
||
// Comprueba que un candidato existe | ||
function candidatoEsValido(bytes32 candidato) public returns (bool) { | ||
return (candidatos[candidato]); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<title>Aplicacion De Votacion</title> | ||
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'> | ||
<link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' type='text/css'> | ||
</head> | ||
<body class="container"> | ||
<h1>Votacion Ecuador</h1> | ||
<div id="address"></div> | ||
<div class="table-responsive"> | ||
<table class="table table-bordered"> | ||
<thead> | ||
<tr> | ||
<th>Candidato</th> | ||
<th>Votos</th> | ||
</tr> | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<td>Correa</td> | ||
<td id="candidato-1"></td> | ||
</tr> | ||
<tr> | ||
<td>Nebot</td> | ||
<td id="candidato-2"></td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
<div id="msg"></div> | ||
</div> | ||
<select id="candidato"> | ||
<option value="Correa">Correa</option> | ||
<option value="Nebot">Nebot</option> | ||
</select> | ||
<a href="#" onclick="votar()" class="btn btn-primary">Votar</a> | ||
</body> | ||
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script> | ||
<script src="index.js"></script> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// Import the page's CSS. Webpack will know what to do with it. | ||
|
||
|
||
// Import libraries we need. | ||
import { default as Web3} from 'web3'; | ||
import { default as contract } from 'truffle-contract' | ||
|
||
import voting_artifacts from '../../build/contracts/Votacion.json' | ||
|
||
var Voting = contract(voting_artifacts); | ||
|
||
let candidatos = {"Correa": "candidato-1", "Nebot": "candidato-2"} | ||
|
||
// funcion para votar a un candidato que se pasa como parametro. Una vez minada la transaccion se actualiza el contador | ||
window.votar = function(candidato) { | ||
let nombreCandidato = $("#candidato").val(); | ||
try { | ||
$("#msg").html("Tu voto ha sido emitido. El número de votos se actualizará cuando la transacción sea minada. Espera.") | ||
$("#candidato").val(""); | ||
|
||
Voting.deployed().then(function(contractInstance) { | ||
contractInstance.votar(web3.utils.asciiToHex(nombreCandidato), {gas: 140000, from: web3.eth.getAccounts()}).then(function() { | ||
let div_id = candidatos[nombreCandidato]; | ||
return contractInstance.votosTotales.call(web3.utils.asciiToHex(nombreCandidato)).then(function(v) { | ||
$("#" + div_id).html(v.toString()); | ||
$("#msg").html(""); | ||
}); | ||
}); | ||
}); | ||
} catch (err) { | ||
console.log(err); | ||
} | ||
} | ||
|
||
// cuando se carga la página se inicializa la conexión con la blockchain y se actualizan los votos de cada candidato | ||
$( document ).ready(function() { | ||
if (typeof web3 !== 'undefined') { | ||
console.warn("Usando web3 de fuente externa como Metamask") | ||
window.web3 = new Web3(web3.currentProvider); | ||
} else { | ||
console.warn("No web3 detectado. Redirifiendo a http://localhost:7545."); | ||
window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545")); | ||
} | ||
|
||
Voting.setProvider(web3.currentProvider); | ||
let nombreCandidatos = Object.keys(candidatos); | ||
|
||
for (var i = 0; i < nombreCandidatos.length; i++) { | ||
let nombre = nombreCandidatos[i]; | ||
Voting.deployed().then(function(contractInstance) { | ||
contractInstance.votosTotales.call(web3.utils.asciiToHex(nombre)).then(function(v) { | ||
|
||
$("#" + candidatos[nombre]).html(v.toString()); | ||
}); | ||
}) | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
const Migrations = artifacts.require("Migrations"); | ||
|
||
module.exports = function(deployer) { | ||
deployer.deploy(Migrations); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
var Votacion = artifacts.require("./Votacion.sol"); | ||
|
||
module.exports = function(deployer) { | ||
deployer.deploy(Votacion, ['Correa', 'Nebot'].map(x => web3.utils.asciiToHex(x)), {gas: 6700000}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/** | ||
* Use this file to configure your truffle project. It's seeded with some | ||
* common settings for different networks and features like migrations, | ||
* compilation and testing. Uncomment the ones you need or modify | ||
* them to suit your project as necessary. | ||
* | ||
* More information about configuration can be found at: | ||
* | ||
* truffleframework.com/docs/advanced/configuration | ||
* | ||
* To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) | ||
* to sign your transactions before they're sent to a remote public node. Infura accounts | ||
* are available for free at: infura.io/register. | ||
* | ||
* You'll also need a mnemonic - the twelve word phrase the wallet uses to generate | ||
* public/private key pairs. If you're publishing your code to GitHub make sure you load this | ||
* phrase from a file you've .gitignored so it doesn't accidentally become public. | ||
* | ||
*/ | ||
|
||
// const HDWallet = require('truffle-hdwallet-provider'); | ||
// const infuraKey = "fj4jll3k....."; | ||
// | ||
// const fs = require('fs'); | ||
// const mnemonic = fs.readFileSync(".secret").toString().trim(); | ||
|
||
module.exports = { | ||
/** | ||
* Networks define how you connect to your ethereum client and let you set the | ||
* defaults web3 uses to send transactions. If you don't specify one truffle | ||
* will spin up a development blockchain for you on port 9545 when you | ||
* run `develop` or `test`. You can ask a truffle command to use a specific | ||
* network from the command line, e.g | ||
* | ||
* $ truffle test --network <network-name> | ||
*/ | ||
|
||
networks: { | ||
// Useful for testing. The `development` name is special - truffle uses it by default | ||
// if it's defined here and no other network is specified at the command line. | ||
// You should run a client (like ganache-cli, geth or parity) in a separate terminal | ||
// tab if you use this network and you must also set the `host`, `port` and `network_id` | ||
// options below to some value. | ||
// | ||
ganache: { | ||
host: "127.0.0.1", // Localhost (default: none) | ||
port: 7545, // Standard Ethereum port (default: none) | ||
network_id: "5777", // Any network (default: none) | ||
}, | ||
development: { | ||
host: "127.0.0.1", // Localhost (default: none) | ||
port: 7545, // Standard Ethereum port (default: none) | ||
network_id: "*", // Any network (default: none) | ||
}, | ||
|
||
// develop: { | ||
// port: 8545 | ||
// }, | ||
|
||
// Another network with more advanced options... | ||
// advanced: { | ||
// port: 8777, // Custom port | ||
// network_id: 1342, // Custom network | ||
// gas: 8500000, // Gas sent with each transaction (default: ~6700000) | ||
// gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) | ||
// from: <address>, // Account to send txs from (default: accounts[0]) | ||
// websockets: true // Enable EventEmitter interface for web3 (default: false) | ||
// }, | ||
|
||
// Useful for deploying to a public network. | ||
// NB: It's important to wrap the provider as a function. | ||
// ropsten: { | ||
// provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), | ||
// network_id: 3, // Ropsten's id | ||
// gas: 5500000, // Ropsten has a lower block limit than mainnet | ||
// confirmations: 2, // # of confs to wait between deployments. (default: 0) | ||
// timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) | ||
// skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) | ||
// }, | ||
|
||
// Useful for private networks | ||
// private: { | ||
// provider: () => new HDWalletProvider(mnemonic, `https://network.io`), | ||
// network_id: 2111, // This network is yours, in the cloud. | ||
// production: true // Treats this network as if it was a public net. (default: false) | ||
// } | ||
}, | ||
|
||
// Set default mocha options here, use special reporters etc. | ||
mocha: { | ||
// timeout: 100000 | ||
}, | ||
|
||
// Configure your compilers | ||
compilers: { | ||
solc: { | ||
// version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version) | ||
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false) | ||
// settings: { // See the solidity docs for advice about optimization and evmVersion | ||
// optimizer: { | ||
// enabled: false, | ||
// runs: 200 | ||
// }, | ||
// evmVersion: "byzantium" | ||
// } | ||
} | ||
} | ||
} |