Skip to content

Instantly share code, notes, and snippets.

@chespond
Created March 24, 2024 23:29
Show Gist options
  • Save chespond/f4dd38f2be43b46b619dd6bd1158cebc to your computer and use it in GitHub Desktop.
Save chespond/f4dd38f2be43b46b619dd6bd1158cebc to your computer and use it in GitHub Desktop.
Base voting Project
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract chesVote{
// Struct to represent a proposal in the DAO
struct Proposal {
string description;
uint256 voteCount;
uint256 yesVotes;
uint256 noVotes;
bool executed;
}
// Struct to represent a member of the DAO
struct Member {
address memberAddress;
uint256 memberSince;
uint256 tokenBalance;
}
address[] public members;
mapping(address => bool) public isMember;
mapping(address => Member) public memberInfo;
mapping(address => mapping(uint => bool)) public votes;
Proposal[] public proposals;
address public owner;
uint256 public totalSupply; // Total token supply
mapping(address => uint256) public balances; // Mapping to store token balances of members
event ProposalCreated(uint256 indexed proposalId, string description); // Event emitted when a proposal is created
event VoteCast(address indexed voter, uint256 indexed proposalId, uint256 tokenAmount); // Event emitted when a vote is cast
event ProposalAccepted(string message); // Event emitted when a proposal is accepted
event ProposalRejected(string rejected); // Event emitted when a proposal is rejected
constructor(){
owner = msg.sender;
}
// Function to add a member to the DAO
function addMember(address _member) public {
require(msg.sender == owner);
require(isMember[_member] == false, "Member already exists");
memberInfo[_member] = Member({
memberAddress: _member,
memberSince: block.timestamp,
tokenBalance: 0
});
members.push(_member);
isMember[_member] = true;
balances[_member] = 0;
totalSupply += 18;
}
// Function to remove a member from the DAO
function removeMember(address _member) public {
require(isMember[_member] == true, "member does not exist");
memberInfo[_member] = Member({
memberAddress: address(0),
memberSince: 0,
tokenBalance: 0
});
for (uint256 i = 0; i < members.length; i++) {
if (members[i] == _member) {
members[i] = members[members.length - 1];
members.pop();
break;
}
}
isMember[_member] = false;
balances[_member] = 0;
totalSupply -= 18;
}
// Function to create a proposal in the DAO
function createProposal(string memory _description) public {
proposals.push(Proposal({
description: _description,
voteCount: 0,
yesVotes: 0,
noVotes: 0,
executed: false
}));
emit ProposalCreated(proposals.length - 1, _description);
}
// Function for a member to vote on a proposal
function voteYes(uint _proposalId, uint _tokenAmount) public {
require(isMember[msg.sender] == true, "You should be a memeber to vote");
require(balances[msg.sender] >= _tokenAmount, "Not enough tokens to vote");
require(votes[msg.sender][_proposalId] == false, "You have already voted for this proposal");
votes[msg.sender][_proposalId] = true;
memberInfo[msg.sender].tokenBalance -= _tokenAmount;
proposals[_proposalId].voteCount += _tokenAmount;
proposals[_proposalId].yesVotes += _tokenAmount;
emit VoteCast(msg.sender, _proposalId, _tokenAmount);
}
function voteNo(uint256 _proposalId, uint256 _tokenAmount) public {
require(isMember[msg.sender] == true, "You should be a memeber to vote");
require(balances[msg.sender] >= _tokenAmount, "Not enough tokens to vote");
require(votes[msg.sender][_proposalId] == false, "You have already voted for this proposal");
votes[msg.sender][_proposalId] = true;
memberInfo[msg.sender].tokenBalance -= _tokenAmount;
proposals[_proposalId].voteCount += _tokenAmount;
proposals[_proposalId].noVotes += _tokenAmount;
emit VoteCast(msg.sender, _proposalId, _tokenAmount);
}
// Function to execute a proposal in the DAO
function executeProposal(uint256 _proposalId) public {
require(proposals[_proposalId].executed == false, "Proposal has already been executed");
require(proposals[_proposalId].yesVotes > proposals[_proposalId].noVotes, "Do not have enough votes");
proposals[_proposalId].executed = true;
emit ProposalAccepted("Proposal has been approved");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment