Created
March 3, 2023 18:32
-
-
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=
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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