Skip to content

Instantly share code, notes, and snippets.

@ArslanKathia
Created March 3, 2023 18:32
Show Gist options
  • Save ArslanKathia/f8f635485210a363a983c13aa1dca2f8 to your computer and use it in GitHub Desktop.
Save ArslanKathia/f8f635485210a363a983c13aa1dca2f8 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.18+commit.87f61d96.js&optimize=false&runs=200&gist=
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @custom:security contact [email protected]
contract DAO{
//variables
address public owner;
mapping(address => bool) public members;
uint public totalShares;
mapping(address => uint) public shares;
uint VotingPeriod = 7 days;
//events
event MemberAdded(address member);
event MemberRemoved(address member);
event SharesBought(address buyer,uint amount);
event SharesSold(address seller,uint amount);
event ProposalSubmitted(address proposer,string proposal);
event Voted(address voter,uint proposalId,bool inFavor);
event ProposalExecuted(address executor,uint proposalId);
//Structs
struct Proposal{
address proposer;
string description;
uint votesFor;
uint votesAgainst;
bool executed;
bool isApproved;
mapping(address => bool) hasVoted;
}
//Arrays
//Proposal[] public proposals;
//mapping
mapping(uint => Proposal) proposals;
uint proposalId;
//Modifier
modifier onlyOwner(){
require(msg.sender == owner,"Only owner can call this");
_;
}
//check member is member
modifier onlyMember(){
require(members[msg.sender],"Only member can call this");
_;
}
//Constructor
constructor()
{
owner = msg.sender;
members[msg.sender] = true;
totalShares = 100;
shares[msg.sender]= 100;
}
//Functions
function addMember(address _member) public onlyOwner{
require(!members[_member],"Member does not exist");
members[_member] = true;
totalShares++;
shares[_member] = 1;
emit MemberAdded(_member);
}
function removeMember(address _member) public onlyOwner{
require(members[_member],"Member does not exist");
require(_member != owner,"Cannot remove owner!");
members[_member] = false;
totalShares --;
shares[_member] = 0;
emit MemberRemoved(_member);
}
function buyShares(uint _amount) public payable onlyMember{
require(_amount <= (totalShares-shares[msg.sender]),"Not enough share available");
uint cost = _amount * 1 ether;
require(msg.value == cost,"Incorrect value sent");
shares[msg.sender] +=_amount;
totalShares += _amount;
emit SharesBought(msg.sender,_amount);
}
function sellShares(uint _amount) public onlyOwner{
require(shares[msg.sender]>=_amount,"Not enough shares");
shares[msg.sender] -= _amount;
totalShares -= _amount;
payable(msg.sender).transfer(_amount * 1 ether);
emit SharesSold(msg.sender,_amount);
}
function submitProposal(string memory _description) public onlyMember{
proposalId++;
Proposal storage proposal = proposals[proposalId];
proposal.proposer = msg.sender;
proposal.description = _description;
proposal.votesFor = 0;
proposal.votesAgainst = 0;
proposal.executed = false;
proposal.isApproved = false;
proposal.hasVoted[msg.sender] = false;
emit ProposalSubmitted(msg.sender,_description);
}
//Nice Functionality
function vote(uint _proposalId,bool _inFavor) public onlyMember{
Proposal storage proposal = proposals[_proposalId];
require(!proposal.executed,"Proposal already executed");
require(!proposal.hasVoted[msg.sender],"Already voted on proposal");
if(_inFavor){
proposal.votesFor += shares[msg.sender];
}else{
proposal.votesAgainst += shares[msg.sender];
}
proposal.hasVoted[msg.sender]= true;
emit Voted(msg.sender,_proposalId,_inFavor);
}
function executeProposal(uint _proposalId) public onlyMember{
Proposal storage proposal = proposals[_proposalId];
require(!proposal.executed,"Proposal already executed");
require(block.timestamp > VotingPeriod,"Voting period has not expired");
/* uint votesNeeded = totalShares / 2; */
if(proposal.votesFor > proposal.votesAgainst){
//Execute the proposal
proposal.executed = true;
proposal.isApproved = true;
emit ProposalExecuted(msg.sender,_proposalId);
}else if(proposal.votesAgainst > proposal.votesFor){
//Proposal rejected
proposal.executed = true;
proposal.isApproved =false;
emit ProposalExecuted(msg.sender,_proposalId);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment