Election DApp Election.sol
pragma solidity ^0.5.16; contract Election {
// Model a candidate struct Candidate {uint id;
string name; uint voteCount;
} // Store a candidate//Fetch Candidate mapping(uint => Candidate) public candidates;
// Store candidate count
uint public candidatesCount;//constructor constructor() public { addCandidate(“KamalHaasan”); addCandidate(“RajniKanth”);
} function addCandidate (string memory _name) private
{ candidatesCount ++;
candidates[candidatesCount] = Candidate(candidatesCount, _name, 0);
}
}
2_deploy_contract.js
var Election = artifacts.require(“./Election.sol”);
module.exports = function(deployer) { deployer.deploy(Election);
};
Election.js
var Election = artifacts.require(“./Election.sol”);
contract(“Election”, function (accounts) {it(“initializes with two candidates”, function() {return Election.deployed().then(function(instance) {
return instance.candidatesCount();
}).then(function(count) {assert.equal(count, 2);
});
});
});
it(“it initializes the candidates with the correct values”, function()
{return Election.deployed().then(function(instance)
{electionInstance = instance;
return electionInstance.candidates(1);
}).then(function(candidate) {
assert.equal(candidate[0], 1, “contains the correct id”); assert.equal(candidate[1], “KamalHaasan”, “contains the correct name”); assert.equal(candidate[2], 0, “contains the correct votes count”);
return electionInstance.candidates(2);
}).then(function(candidate) {
assert.equal(candidate[0], 2, “contains the correct id”); assert.equal(candidate[1], “RajniKanth”, “contains the correct name”); assert.equal(candidate[2], 0, “contains the correct votes count”);
});
});
App.js
App = {
web3Provider: null, contracts: {},
account: ‘0x0’,init: function() {return App.initWeb3();
},initWeb3: function() {
// TODO: refactor conditional
if (typeof web3!== ‘undefined’) {
// If a web3 instance is already provided by Meta Mask. App.web3Provider = web3.currentProvider;
web3 = new Web3(web3.currentProvider);
} else {
// Specify default instance if no web3 instance provided
App.web3Provider = new Web3.providers.HttpProvider(‘http://localhost:7545’); web3 = new Web3(App.web3Provider);
}
return App.initContract();
},initContract: function() {
$.getJSON(“Election.json”, function(election) {
// Instantiate a new truffle contract from the artifact App.contracts.Election = TruffleContract(election);
// Connect provider to interact with contract App.contracts.Election.setProvider(App.web3Provider);return App.render();
});
},render: function() {var electionInstance;
var loader = $(“#loader”);
var content = $(“#content”);loader.show(); content.hide();// Load account data web3.eth.getCoinbase(function(err, account) {if (err === null) {
App.account = account;
$(“#accountAddress”).html(“Your Account: “ + account);
}
});// Load contract data App.contracts.Election.deployed().then(function(instance) {electionInstance = instance;
return electionInstance.candidatesCount();
}).then(function(candidatesCount) {
var candidatesResults = $(“#candidatesResults”); candidatesResults.empty();for (var i = 1; i <= candidatesCount; i++) {electionInstance.candidates(i).then(function(candidate) {
var id = candidate[0]; var name = candidate[1];
var voteCount = candidate[2];// Render candidate Result
var candidateTemplate = “<tr><th>“ + id + “</th><td>“ + name + “</td><td>“ + voteCount + “</td></tr>“ candidatesResults.append(candidateTemplate);
});
}loader.hide(); content.show();
}).catch(function(error) {
console.warn(error);
});
}
};$(function() {
$(window).load(function() {App.init();
});
});
Package.json
{
“name”: “pet-shop”,
“version”: “1.0.0”,
“description”: ““,
“main”: “truffle.js”, “directories”: {“test”: “test”
},
“scripts”: {
“dev”: “lite-server”,
“test”: “echo \”Error: no test specified\” && exit 1”
},
“author”: ““,
“license”: “ISC”, “devDependencies”: {
“lite-server”: “^2.3.0”
}
}
Index.html
<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset=“utf-8”>
<meta http-equiv=“X-UA-Compatible” content=“IE=edge”>
<meta name=“viewport” content=“width=device-width, initial-scale=1”>
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<title>Election Results</title><!-- Bootstrap -->
<link href=“css/bootstrap.min.css” rel=“stylesheet”><!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn’t work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src=“https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js”></script>
<script src=“https://oss.maxcdn.com/respond/1.4.2/respond.min.js”></script>
<![endif]-->
</head>
<body>
<div class=“container” style=“width: 650px;”>
<div class=“row”>
<div class=“col-lg-12”>
<h1 class=“text-center”>Election Results</h1>
<hr/>
<br/>
<div id=“loader”>
<p class=“text-center”>Loading...</p>
</div>
<div id=“content” style=“display: none;”>
<table class=“table”>
<thead>
<tr>
<th scope=“col”>#</th>
<th scope=“col”>Name</th>
<th scope=“col”>Votes</th>
</tr>
</thead>
<tbody id=“candidatesResults”>
</tbody>
</table>
<hr/>
<p id=“accountAddress” class=“text-center”></p>
</div>
</div>
</div>
</div><!-- jQuery (necessary for Bootstrap’s JavaScript plugins) -->
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js”></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src=“js/bootstrap.min.js”></script>
<script src=“js/web3.min.js”></script>
<script src=“js/truffle-contract.js”></script>
<script src=“js/app.js”></script>
</body>
</html>