Added quadratic voting

This commit is contained in:
Richard Ramos 2018-06-26 16:34:28 -04:00
parent 2979fbcc2e
commit f7985fb57c
2 changed files with 40 additions and 9 deletions

View File

@ -27,7 +27,10 @@ contract SingleChoice is Controlled {
string public question; string public question;
string[] public choices; string[] public choices;
int[] public result; int[] public result;
int[] public qvResult;
bytes32 uid; bytes32 uid;
function SingleChoice(address _controller, bytes _rlpDefinition, uint salt) { function SingleChoice(address _controller, bytes _rlpDefinition, uint salt) {
@ -55,6 +58,7 @@ contract SingleChoice is Controlled {
} }
result.length = choices.length; result.length = choices.length;
qvResult.length = choices.length;
} }
function pollType() public constant returns (bytes32) { function pollType() public constant returns (bytes32) {
@ -71,7 +75,18 @@ contract SingleChoice is Controlled {
function deltaVote(int _amount, bytes32 _ballot) onlyController returns (bool _succes) { function deltaVote(int _amount, bytes32 _ballot) onlyController returns (bool _succes) {
if (!isValid(_ballot)) return false; if (!isValid(_ballot)) return false;
uint v = uint(_ballot) / (2**248); uint v = uint(_ballot) / (2**248);
result[v] += _amount; result[v] += _amount;
int qv;
if (_amount < 0) {
qv = -sqrt(-_amount);
} else {
qv = sqrt(_amount);
}
qvResult[v] += qv;
return true; return true;
} }
@ -82,6 +97,15 @@ contract SingleChoice is Controlled {
function getBallot(uint _option) constant returns(bytes32) { function getBallot(uint _option) constant returns(bytes32) {
return bytes32((_option * (2**248)) + (uint(keccak256(uid, _option)) & (2**248 -1))); return bytes32((_option * (2**248)) + (uint(keccak256(uid, _option)) & (2**248 -1)));
} }
function sqrt(int256 x) public pure returns (int256 y) {
int256 z = (x + 1) / 2;
y = x;
while (z < y) {
y = z;
z = (x / z + z) / 2;
}
}
} }

View File

@ -59,13 +59,13 @@ describe("VotingDapp", function () {
web3.eth.getAccounts().then((acc) => { web3.eth.getAccounts().then((acc) => {
accounts = acc; accounts = acc;
return SNT.methods.generateTokens(accounts[0], 123456).send() return SNT.methods.generateTokens(accounts[0], 6).send()
}).then((receipt) => { }).then((receipt) => {
return SNT.methods.generateTokens(accounts[1], 789012).send() return SNT.methods.generateTokens(accounts[1], 12).send()
}).then((receipt) => { }).then((receipt) => {
return SNT.methods.generateTokens(accounts[2], 345678).send() return SNT.methods.generateTokens(accounts[2], 10).send()
}).then((receipt) => { }).then((receipt) => {
return SNT.methods.generateTokens(accounts[3], 901234).send() return SNT.methods.generateTokens(accounts[3], 7).send()
}).then((receipt) => { }).then((receipt) => {
done(); done();
}); });
@ -148,18 +148,25 @@ describe("VotingDapp", function () {
poll = await PollManager.methods.poll(pollId).call(); poll = await PollManager.methods.poll(pollId).call();
let votersByBallotYES = await PollManager.methods.getVotesByBallot(pollId, Yes).call(); let votersByBallotYES = await PollManager.methods.getVotesByBallot(pollId, Yes).call();
let tokenVotesByBallotYES = await pollContract.methods.result(0).call(); // 0 == Yes (because it is the initial option ) let tokenVotesByBallotYES = await pollContract.methods.result(0).call(); // 0 == Yes (because it is the initial option )
let quadraticVotesByBallotYES = await pollContract.methods.qvResult(0).call(); // 0 == Yes (because it is the initial option )
// console.dir(poll); // Will contain state of the poll // Will contain state of the poll
// console.log(tokenVotesByBallotYES); // Contains how many votes has a ballot // console.dir(poll);
// console.log(votersByBallotYES); // Contains how many voters voted for that option
// Contains how many votes has a ballot
// console.log(tokenVotesByBallotYES);
// Contains how many votes has a ballot using quadratic voting
//console.log(quadraticVotesByBallotYES);
// Contains how many voters voted for that option
// console.log(votersByBallotYES);
// =================================================== // ===================================================
// Unvote // Unvote
receipt = await PollManager.methods.unvote(pollId).send({from: accounts[0]}); receipt = await PollManager.methods.unvote(pollId).send({from: accounts[0]});
assert.equal(!!receipt.events.Unvote, true, "Unvote not triggered"); assert.equal(!!receipt.events.Unvote, true, "Unvote not triggered");
}); });
}); });