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

Fix constructor

parent 4f928a93
......@@ -8,7 +8,6 @@ import "@openzeppelin/contracts/access/Ownable.sol";
* @custom:dev-run-script ./scripts/deploy.js
*/
contract Voting is Ownable {
/**
* @dev Structure représentant un votant
* @param isRegistered Si l'adresse est enregistrée comme électeur
......@@ -54,7 +53,10 @@ contract Voting is Ownable {
* @param previousStatus Le statut précédent
* @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
......@@ -91,7 +93,7 @@ contract Voting is Ownable {
/**
* @dev Constructeur qui initialise le contrat
*/
constructor() Ownable() {
constructor(address _deployer) Ownable(_deployer) {
workflowStatus = WorkflowStatus.RegisteringVoters;
// Ajout d'une proposition vide à l'index 0
proposals.push(Proposal("Genesis Proposal", 0));
......@@ -101,7 +103,10 @@ contract Voting is Ownable {
* @dev Modificateur pour vérifier si l'appelant est un électeur enregistré
*/
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 {
* @param _voterAddress L'adresse de l'électeur à enregistrer
*/
function registerVoter(address _voterAddress) external onlyOwner {
require(workflowStatus == WorkflowStatus.RegisteringVoters, "La periode d'inscription des electeurs est terminee");
require(!voters[_voterAddress].isRegistered, "L'electeur est deja enregistre");
require(
workflowStatus == WorkflowStatus.RegisteringVoters,
"La periode d'inscription des electeurs est terminee"
);
require(
!voters[_voterAddress].isRegistered,
"L'electeur est deja enregistre"
);
voters[_voterAddress].isRegistered = true;
emit VoterRegistered(_voterAddress);
......@@ -121,14 +132,21 @@ contract Voting is Ownable {
* @dev Démarre la session d'enregistrement des propositions
* @param _durationInMinutes Durée en minutes de la période d'enregistrement
*/
function startProposalsRegistration(uint _durationInMinutes) external onlyOwner {
require(workflowStatus == WorkflowStatus.RegisteringVoters, "Impossible de demarrer la session d'enregistrement");
function startProposalsRegistration(
uint _durationInMinutes
) external onlyOwner {
require(
workflowStatus == WorkflowStatus.RegisteringVoters,
"Impossible de demarrer la session d'enregistrement"
);
WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.ProposalsRegistrationStarted;
// 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);
}
......@@ -137,10 +155,21 @@ contract Voting is Ownable {
* @dev Enregistre une nouvelle proposition
* @param _description La description de la proposition
*/
function registerProposal(string calldata _description) external onlyVoters {
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");
function registerProposal(
string calldata _description
) external onlyVoters {
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));
emit ProposalRegistered(proposals.length - 1);
......@@ -150,7 +179,10 @@ contract Voting is Ownable {
* @dev Termine la session d'enregistrement des propositions
*/
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 = WorkflowStatus.ProposalsRegistrationEnded;
......@@ -163,7 +195,10 @@ contract Voting is Ownable {
* @param _durationInMinutes Durée en minutes de la période de vote
*/
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 = WorkflowStatus.VotingSessionStarted;
......@@ -179,10 +214,16 @@ contract Voting is Ownable {
* @param _proposalId L'ID de la proposition
*/
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(_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].votedProposalId = _proposalId;
......@@ -200,16 +241,31 @@ contract Voting is Ownable {
* @param _to L'adresse à qui déléguer le vote
*/
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(_to != msg.sender, "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");
require(
_to != msg.sender,
"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;
// Vérifier qu'il n'y a pas de boucle de délégation
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];
}
......@@ -229,7 +285,10 @@ contract Voting is Ownable {
* @dev Termine la session de vote
*/
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 = WorkflowStatus.VotingSessionEnded;
......@@ -241,7 +300,10 @@ contract Voting is Ownable {
* @dev Comptabilise les votes et détermine la proposition gagnante
*/
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 = WorkflowStatus.VotesTallied;
......@@ -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)
*/
function checkAndUpdateStatus() external {
if (workflowStatus == WorkflowStatus.ProposalsRegistrationStarted && block.timestamp > registrationEndTime) {
if (
workflowStatus == WorkflowStatus.ProposalsRegistrationStarted &&
block.timestamp > registrationEndTime
) {
WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.ProposalsRegistrationEnded;
emit WorkflowStatusChange(previousStatus, workflowStatus);
}
else if (workflowStatus == WorkflowStatus.VotingSessionStarted && block.timestamp > votingEndTime) {
} else if (
workflowStatus == WorkflowStatus.VotingSessionStarted &&
block.timestamp > votingEndTime
) {
WorkflowStatus previousStatus = workflowStatus;
workflowStatus = WorkflowStatus.VotingSessionEnded;
emit WorkflowStatusChange(previousStatus, workflowStatus);
......@@ -281,7 +348,14 @@ contract Voting is Ownable {
* @return hasVoted Si 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];
return (voter.isRegistered, voter.hasVoted, voter.votedProposalId);
}
......@@ -292,7 +366,9 @@ contract Voting is Ownable {
* @return description La description de 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");
Proposal memory proposal = proposals[_proposalId];
return (proposal.description, proposal.voteCount);
......@@ -304,9 +380,24 @@ contract Voting is Ownable {
* @return description La description de 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) {
require(workflowStatus == WorkflowStatus.VotesTallied, "Les votes n'ont pas encore ete comptabilises");
return (winningProposalId, proposals[winningProposalId].description, proposals[winningProposalId].voteCount);
function getWinner()
external
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 {
* @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
*/
function getDelegation(address _voterAddress) external view onlyVoters returns (address) {
function getDelegation(
address _voterAddress
) external view onlyVoters returns (address) {
return delegations[_voterAddress];
}
}
\ No newline at end of file
}
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