Skip to content

Commit

Permalink
Create pi_network_module_3: Governance.sol
Browse files Browse the repository at this point in the history
  • Loading branch information
KOSASIH authored Aug 28, 2024
1 parent 659325e commit 83a6244
Showing 1 changed file with 61 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
pragma solidity ^0.8.0;

import "./AccessControl.sol";

contract Governance {
using AccessControl for address;

// Mapping of proposals
mapping (uint256 => Proposal) public proposals;

// Struct to represent a proposal
struct Proposal {
uint256 id;
address proposer;
string description;
uint256 voteCount;
bool executed;
}

// Event emitted when a new proposal is created
event NewProposal(uint256 indexed proposalId, address indexed proposer, string description);

// Event emitted when a user votes on a proposal
event Vote(uint256 indexed proposalId, address indexed voter, bool support);

// Event emitted when a proposal is executed
event ExecuteProposal(uint256 indexed proposalId);

// Function to propose a new change to the Pi Network
function propose(string memory _description) public onlyDeveloper {
uint256 proposalId = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender)));
Proposal storage proposal = proposals[proposalId];
proposal.id = proposalId;
proposal.proposer = msg.sender;
proposal.description = _description;
proposal.voteCount = 0;
proposal.executed = false;
emit NewProposal(proposalId, msg.sender, _description);
}

// Function to vote on a proposal
function vote(uint256 _proposalId, bool _support) public {
Proposal storage proposal = proposals[_proposalId];
require(proposal.id != 0, "Proposal does not exist");
require(!proposal.executed, "Proposal has already been executed");
proposal.voteCount += 1;
emit Vote(_proposalId, msg.sender, _support);
}

// Function to execute a proposal that has received sufficient votes
function executeProposal(uint256 _proposalId) public onlyAdmin {
Proposal storage proposal = proposals[_proposalId];
require(proposal.id != 0, "Proposal does not exist");
require(!proposal.executed, "Proposal has already been executed");
require(proposal.voteCount > 50, "Proposal has not received sufficient votes");
proposal.executed = true;
emit ExecuteProposal(_proposalId);
// Execute the proposal logic here
// ...
}
}

0 comments on commit 83a6244

Please sign in to comment.