pragma solidity ^0.4.11; interface ChangableToken { function stop() external; function start() external; function changeBuyPrice(uint256 newBuyPrice) external; function balanceOf(address account) external returns (uint256); function setDAOContract(address newDAOContract) external; } contract DAOContract { ChangableToken public token; uint8 public minVotes = 2; uint256 public proposedBuyPrice; bool public voteIsActive = false; struct Votes { int result; uint numberOfVotes; } Votes public election; constructor(ChangableToken _token) public { token = _token; } ///////// owner account privilege function newContractPriceProposal(uint256 _newBuyPrice) public { require(!voteIsActive); proposedBuyPrice = _newBuyPrice; voteIsActive = true; token.stop(); // triggering as DAO } ///////// tokens holders accounts privilege function vote(bool _vote) public { require(voteIsActive); election.result += int(token.balanceOf(msg.sender)) * (_vote ? int(1): int(-1)); election.numberOfVotes += uint(token.balanceOf(msg.sender)); } ///////// owner account privilege function resetBuyPrice() public { require(voteIsActive); require(election.numberOfVotes >= minVotes); if(election.result > 0) { token.changeBuyPrice(proposedBuyPrice); // triggering as DAO } election.numberOfVotes = 0; election.result = 0; voteIsActive = false; token.start(); // triggering as DAO } }
0.4.24