Commit 0f5ba749 authored by Quentin Hamitouche's avatar Quentin Hamitouche

Fix constructor

parent 4f928a93
...@@ -8,7 +8,6 @@ import "@openzeppelin/contracts/access/Ownable.sol"; ...@@ -8,7 +8,6 @@ import "@openzeppelin/contracts/access/Ownable.sol";
* @custom:dev-run-script ./scripts/deploy.js * @custom:dev-run-script ./scripts/deploy.js
*/ */
contract Voting is Ownable { contract Voting is Ownable {
/** /**
* @dev Structure représentant un votant * @dev Structure représentant un votant
* @param isRegistered Si l'adresse est enregistrée comme électeur * @param isRegistered Si l'adresse est enregistrée comme électeur
...@@ -54,7 +53,10 @@ contract Voting is Ownable { ...@@ -54,7 +53,10 @@ contract Voting is Ownable {
* @param previousStatus Le statut précédent * @param previousStatus Le statut précédent
* @param newStatus Le nouveau statut * @param newStatus Le nouveau statut
*/ */
event WorkflowStatusChange(WorkflowStatus previousStatus, WorkflowStatus newStatus); event WorkflowStatusChange(
WorkflowStatus previousStatus,
WorkflowStatus newStatus
);
/** /**
* @dev Événement émis lors de l'enregistrement d'une proposition * @dev Événement émis lors de l'enregistrement d'une proposition
...@@ -91,7 +93,7 @@ contract Voting is Ownable { ...@@ -91,7 +93,7 @@ contract Voting is Ownable {
/** /**
* @dev Constructeur qui initialise le contrat * @dev Constructeur qui initialise le contrat
*/ */
constructor() Ownable() { constructor(address _deployer) Ownable(_deployer) {
workflowStatus = WorkflowStatus.RegisteringVoters; workflowStatus = WorkflowStatus.RegisteringVoters;
// Ajout d'une proposition vide à l'index 0 // Ajout d'une proposition vide à l'index 0
proposals.push(Proposal("Genesis Proposal", 0)); proposals.push(Proposal("Genesis Proposal", 0));
...@@ -101,7 +103,10 @@ contract Voting is Ownable { ...@@ -101,7 +103,10 @@ contract Voting is Ownable {
* @dev Modificateur pour vérifier si l'appelant est un électeur enregistré * @dev Modificateur pour vérifier si l'appelant est un électeur enregistré
*/ */
modifier onlyVoters() { modifier onlyVoters() {
require(voters[msg.sender].isRegistered, "Vous n'etes pas un electeur enregistre"); require(
voters[msg.sender].isRegistered,
"Vous n'etes pas un electeur enregistre"
);
_; _;
} }
...@@ -110,8 +115,14 @@ contract Voting is Ownable { ...@@ -110,8 +115,14 @@ contract Voting is Ownable {
* @param _voterAddress L'adresse de l'électeur à enregistrer * @param _voterAddress L'adresse de l'électeur à enregistrer
*/ */
function registerVoter(address _voterAddress) external onlyOwner { function registerVoter(address _voterAddress) external onlyOwner {
require(workflowStatus == WorkflowStatus.RegisteringVoters, "La periode d'inscription des electeurs est terminee"); require(
require(!voters[_voterAddress].isRegistered, "L'electeur est deja enregistre"); workflowStatus == WorkflowStatus.RegisteringVoters,
"La periode d'inscription des electeurs est terminee"
);
require(
!voters[_voterAddress].isRegistered,
"L'electeur est deja enregistre"
);
voters[_voterAddress].isRegistered = true; voters[_voterAddress].isRegistered = true;
emit VoterRegistered(_voterAddress); emit VoterRegistered(_voterAddress);
...@@ -121,14 +132,21 @@ contract Voting is Ownable { ...@@ -121,14 +132,21 @@ contract Voting is Ownable {
* @dev Démarre la session d'enregistrement des propositions * @dev Démarre la session d'enregistrement des propositions
* @param _durationInMinutes Durée en minutes de la période d'enregistrement * @param _durationInMinutes Durée en minutes de la période d'enregistrement
*/ */
function startProposalsRegistration(uint _durationInMinutes) external onlyOwner { function startProposalsRegistration(
require(workflowStatus == WorkflowStatus.RegisteringVoters, "Impossible de demarrer la session d'enregistrement"); uint _durationInMinutes
) external onlyOwner {
require(
workflowStatus == WorkflowStatus.RegisteringVoters,
"Impossible de demarrer la session d'enregistrement"
);
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.ProposalsRegistrationStarted; workflowStatus = WorkflowStatus.ProposalsRegistrationStarted;
// Définir une date limite pour l'enregistrement (fonctionnalité supplémentaire) // Définir une date limite pour l'enregistrement (fonctionnalité supplémentaire)
registrationEndTime = block.timestamp + (_durationInMinutes * 1 minutes); registrationEndTime =
block.timestamp +
(_durationInMinutes * 1 minutes);
emit WorkflowStatusChange(previousStatus, workflowStatus); emit WorkflowStatusChange(previousStatus, workflowStatus);
} }
...@@ -137,10 +155,21 @@ contract Voting is Ownable { ...@@ -137,10 +155,21 @@ contract Voting is Ownable {
* @dev Enregistre une nouvelle proposition * @dev Enregistre une nouvelle proposition
* @param _description La description de la proposition * @param _description La description de la proposition
*/ */
function registerProposal(string calldata _description) external onlyVoters { function registerProposal(
require(workflowStatus == WorkflowStatus.ProposalsRegistrationStarted, "La session d'enregistrement des propositions n'est pas active"); string calldata _description
require(bytes(_description).length > 0, "La description ne peut pas etre vide"); ) external onlyVoters {
require(block.timestamp <= registrationEndTime, "La periode d'enregistrement des propositions est terminee"); require(
workflowStatus == WorkflowStatus.ProposalsRegistrationStarted,
"La session d'enregistrement des propositions n'est pas active"
);
require(
bytes(_description).length > 0,
"La description ne peut pas etre vide"
);
require(
block.timestamp <= registrationEndTime,
"La periode d'enregistrement des propositions est terminee"
);
proposals.push(Proposal(_description, 0)); proposals.push(Proposal(_description, 0));
emit ProposalRegistered(proposals.length - 1); emit ProposalRegistered(proposals.length - 1);
...@@ -150,7 +179,10 @@ contract Voting is Ownable { ...@@ -150,7 +179,10 @@ contract Voting is Ownable {
* @dev Termine la session d'enregistrement des propositions * @dev Termine la session d'enregistrement des propositions
*/ */
function endProposalsRegistration() external onlyOwner { function endProposalsRegistration() external onlyOwner {
require(workflowStatus == WorkflowStatus.ProposalsRegistrationStarted, "Impossible de terminer la session d'enregistrement"); require(
workflowStatus == WorkflowStatus.ProposalsRegistrationStarted,
"Impossible de terminer la session d'enregistrement"
);
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.ProposalsRegistrationEnded; workflowStatus = WorkflowStatus.ProposalsRegistrationEnded;
...@@ -163,7 +195,10 @@ contract Voting is Ownable { ...@@ -163,7 +195,10 @@ contract Voting is Ownable {
* @param _durationInMinutes Durée en minutes de la période de vote * @param _durationInMinutes Durée en minutes de la période de vote
*/ */
function startVotingSession(uint _durationInMinutes) external onlyOwner { function startVotingSession(uint _durationInMinutes) external onlyOwner {
require(workflowStatus == WorkflowStatus.ProposalsRegistrationEnded, "Impossible de demarrer la session de vote"); require(
workflowStatus == WorkflowStatus.ProposalsRegistrationEnded,
"Impossible de demarrer la session de vote"
);
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.VotingSessionStarted; workflowStatus = WorkflowStatus.VotingSessionStarted;
...@@ -179,10 +214,16 @@ contract Voting is Ownable { ...@@ -179,10 +214,16 @@ contract Voting is Ownable {
* @param _proposalId L'ID de la proposition * @param _proposalId L'ID de la proposition
*/ */
function vote(uint _proposalId) external onlyVoters { function vote(uint _proposalId) external onlyVoters {
require(workflowStatus == WorkflowStatus.VotingSessionStarted, "La session de vote n'est pas active"); require(
workflowStatus == WorkflowStatus.VotingSessionStarted,
"La session de vote n'est pas active"
);
require(!voters[msg.sender].hasVoted, "Vous avez deja vote"); require(!voters[msg.sender].hasVoted, "Vous avez deja vote");
require(_proposalId < proposals.length, "La proposition n'existe pas"); require(_proposalId < proposals.length, "La proposition n'existe pas");
require(block.timestamp <= votingEndTime, "La periode de vote est terminee"); require(
block.timestamp <= votingEndTime,
"La periode de vote est terminee"
);
voters[msg.sender].hasVoted = true; voters[msg.sender].hasVoted = true;
voters[msg.sender].votedProposalId = _proposalId; voters[msg.sender].votedProposalId = _proposalId;
...@@ -200,16 +241,31 @@ contract Voting is Ownable { ...@@ -200,16 +241,31 @@ contract Voting is Ownable {
* @param _to L'adresse à qui déléguer le vote * @param _to L'adresse à qui déléguer le vote
*/ */
function delegateVoteTo(address _to) external onlyVoters { function delegateVoteTo(address _to) external onlyVoters {
require(workflowStatus == WorkflowStatus.VotingSessionStarted, "La session de vote n'est pas active"); require(
workflowStatus == WorkflowStatus.VotingSessionStarted,
"La session de vote n'est pas active"
);
require(!voters[msg.sender].hasVoted, "Vous avez deja vote"); require(!voters[msg.sender].hasVoted, "Vous avez deja vote");
require(_to != msg.sender, "Vous ne pouvez pas deleguer votre vote a vous-meme"); require(
require(voters[_to].isRegistered, "L'adresse cible n'est pas un electeur enregistre"); _to != msg.sender,
require(delegations[msg.sender] == address(0), "Vous avez deja delegue votre vote"); "Vous ne pouvez pas deleguer votre vote a vous-meme"
);
require(
voters[_to].isRegistered,
"L'adresse cible n'est pas un electeur enregistre"
);
require(
delegations[msg.sender] == address(0),
"Vous avez deja delegue votre vote"
);
address currentDelegate = _to; address currentDelegate = _to;
// Vérifier qu'il n'y a pas de boucle de délégation // Vérifier qu'il n'y a pas de boucle de délégation
while (delegations[currentDelegate] != address(0)) { while (delegations[currentDelegate] != address(0)) {
require(delegations[currentDelegate] != msg.sender, "Boucle de delegation detectee"); require(
delegations[currentDelegate] != msg.sender,
"Boucle de delegation detectee"
);
currentDelegate = delegations[currentDelegate]; currentDelegate = delegations[currentDelegate];
} }
...@@ -229,7 +285,10 @@ contract Voting is Ownable { ...@@ -229,7 +285,10 @@ contract Voting is Ownable {
* @dev Termine la session de vote * @dev Termine la session de vote
*/ */
function endVotingSession() external onlyOwner { function endVotingSession() external onlyOwner {
require(workflowStatus == WorkflowStatus.VotingSessionStarted, "Impossible de terminer la session de vote"); require(
workflowStatus == WorkflowStatus.VotingSessionStarted,
"Impossible de terminer la session de vote"
);
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.VotingSessionEnded; workflowStatus = WorkflowStatus.VotingSessionEnded;
...@@ -241,7 +300,10 @@ contract Voting is Ownable { ...@@ -241,7 +300,10 @@ contract Voting is Ownable {
* @dev Comptabilise les votes et détermine la proposition gagnante * @dev Comptabilise les votes et détermine la proposition gagnante
*/ */
function tallyVotes() external onlyOwner { function tallyVotes() external onlyOwner {
require(workflowStatus == WorkflowStatus.VotingSessionEnded, "Le comptage des votes ne peut pas encore commencer"); require(
workflowStatus == WorkflowStatus.VotingSessionEnded,
"Le comptage des votes ne peut pas encore commencer"
);
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.VotesTallied; workflowStatus = WorkflowStatus.VotesTallied;
...@@ -262,12 +324,17 @@ contract Voting is Ownable { ...@@ -262,12 +324,17 @@ contract Voting is Ownable {
* @dev Termine automatiquement les phases si les délais sont dépassés (fonctionnalité supplémentaire 1) * @dev Termine automatiquement les phases si les délais sont dépassés (fonctionnalité supplémentaire 1)
*/ */
function checkAndUpdateStatus() external { function checkAndUpdateStatus() external {
if (workflowStatus == WorkflowStatus.ProposalsRegistrationStarted && block.timestamp > registrationEndTime) { if (
workflowStatus == WorkflowStatus.ProposalsRegistrationStarted &&
block.timestamp > registrationEndTime
) {
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.ProposalsRegistrationEnded; workflowStatus = WorkflowStatus.ProposalsRegistrationEnded;
emit WorkflowStatusChange(previousStatus, workflowStatus); emit WorkflowStatusChange(previousStatus, workflowStatus);
} } else if (
else if (workflowStatus == WorkflowStatus.VotingSessionStarted && block.timestamp > votingEndTime) { workflowStatus == WorkflowStatus.VotingSessionStarted &&
block.timestamp > votingEndTime
) {
WorkflowStatus previousStatus = workflowStatus; WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.VotingSessionEnded; workflowStatus = WorkflowStatus.VotingSessionEnded;
emit WorkflowStatusChange(previousStatus, workflowStatus); emit WorkflowStatusChange(previousStatus, workflowStatus);
...@@ -281,7 +348,14 @@ contract Voting is Ownable { ...@@ -281,7 +348,14 @@ contract Voting is Ownable {
* @return hasVoted Si l'électeur a voté * @return hasVoted Si l'électeur a voté
* @return votedProposalId L'ID de la proposition pour laquelle l'électeur a voté * @return votedProposalId L'ID de la proposition pour laquelle l'électeur a voté
*/ */
function getVoter(address _voterAddress) external view onlyVoters returns (bool isRegistered, bool hasVoted, uint votedProposalId) { function getVoter(
address _voterAddress
)
external
view
onlyVoters
returns (bool isRegistered, bool hasVoted, uint votedProposalId)
{
Voter memory voter = voters[_voterAddress]; Voter memory voter = voters[_voterAddress];
return (voter.isRegistered, voter.hasVoted, voter.votedProposalId); return (voter.isRegistered, voter.hasVoted, voter.votedProposalId);
} }
...@@ -292,7 +366,9 @@ contract Voting is Ownable { ...@@ -292,7 +366,9 @@ contract Voting is Ownable {
* @return description La description de la proposition * @return description La description de la proposition
* @return voteCount Le nombre de votes pour la proposition * @return voteCount Le nombre de votes pour la proposition
*/ */
function getProposal(uint _proposalId) external view returns (string memory description, uint voteCount) { function getProposal(
uint _proposalId
) external view returns (string memory description, uint voteCount) {
require(_proposalId < proposals.length, "La proposition n'existe pas"); require(_proposalId < proposals.length, "La proposition n'existe pas");
Proposal memory proposal = proposals[_proposalId]; Proposal memory proposal = proposals[_proposalId];
return (proposal.description, proposal.voteCount); return (proposal.description, proposal.voteCount);
...@@ -304,9 +380,24 @@ contract Voting is Ownable { ...@@ -304,9 +380,24 @@ contract Voting is Ownable {
* @return description La description de la proposition gagnante * @return description La description de la proposition gagnante
* @return voteCount Le nombre de votes pour la proposition gagnante * @return voteCount Le nombre de votes pour la proposition gagnante
*/ */
function getWinner() external view returns (uint winningProposalIndex, string memory description, uint voteCount) { function getWinner()
require(workflowStatus == WorkflowStatus.VotesTallied, "Les votes n'ont pas encore ete comptabilises"); external
return (winningProposalId, proposals[winningProposalId].description, proposals[winningProposalId].voteCount); view
returns (
uint winningProposalIndex,
string memory description,
uint voteCount
)
{
require(
workflowStatus == WorkflowStatus.VotesTallied,
"Les votes n'ont pas encore ete comptabilises"
);
return (
winningProposalId,
proposals[winningProposalId].description,
proposals[winningProposalId].voteCount
);
} }
/** /**
...@@ -322,7 +413,9 @@ contract Voting is Ownable { ...@@ -322,7 +413,9 @@ contract Voting is Ownable {
* @param _voterAddress L'adresse de l'électeur * @param _voterAddress L'adresse de l'électeur
* @return L'adresse à qui le vote a été délégué, ou address(0) si pas de délégation * @return L'adresse à qui le vote a été délégué, ou address(0) si pas de délégation
*/ */
function getDelegation(address _voterAddress) external view onlyVoters returns (address) { function getDelegation(
address _voterAddress
) external view onlyVoters returns (address) {
return delegations[_voterAddress]; return delegations[_voterAddress];
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment