Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
CI
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Guillaume DEWISME
CI
Commits
0f5ba749
Commit
0f5ba749
authored
Mar 23, 2025
by
Quentin Hamitouche
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix constructor
parent
4f928a93
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
127 additions
and
34 deletions
+127
-34
Voting.sol
contracts/Voting.sol
+127
-34
No files found.
contracts/Voting.sol
View file @
0f5ba749
...
...
@@ -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
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment