Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.37 KB | None | 0 0
  1. pragma solidity ^0.4.2;
  2. contract owned {
  3. address public owner;
  4.  
  5. function owned() {
  6. owner = msg.sender;
  7. }
  8.  
  9. modifier onlyOwner {
  10. if (msg.sender != owner) throw;
  11. _;
  12. }
  13.  
  14. function transferOwnership(address newOwner) onlyOwner {
  15. owner = newOwner;
  16. }
  17. }
  18.  
  19. contract tokenRecipient {
  20. event receivedEther(address sender, uint amount);
  21. event receivedTokens(address _from, uint256 _value, address _token, bytes _extraData);
  22.  
  23. function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData){
  24. Token t = Token(_token);
  25. if (!t.transferFrom(_from, this, _value)) throw;
  26. receivedTokens(_from, _value, _token, _extraData);
  27. }
  28.  
  29. function () payable {
  30. receivedEther(msg.sender, msg.value);
  31. }
  32. }
  33.  
  34. contract Token {
  35. function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
  36. }
  37.  
  38. contract Congress is owned, tokenRecipient {
  39.  
  40. /* Contract Variables and events */
  41. uint public minimumQuorum;
  42. uint public debatingPeriodInMinutes;
  43. int public majorityMargin;
  44. Proposal[] public proposals;
  45. uint public numProposals;
  46. mapping (address => uint) public memberId;
  47. Member[] public members;
  48.  
  49. event ProposalAdded(uint proposalID, address recipient, uint amount, string description);
  50. event Voted(uint proposalID, bool position, address voter, string justification);
  51. event ProposalTallied(uint proposalID, int result, uint quorum, bool active);
  52. event MembershipChanged(address member, bool isMember);
  53. event ChangeOfRules(uint minimumQuorum, uint debatingPeriodInMinutes, int majorityMargin);
  54.  
  55. struct Proposal {
  56. address recipient;
  57. uint amount;
  58. string description;
  59. uint votingDeadline;
  60. bool executed;
  61. bool proposalPassed;
  62. uint numberOfVotes;
  63. int currentResult;
  64. bytes32 proposalHash;
  65. Vote[] votes;
  66. mapping (address => bool) voted;
  67. }
  68.  
  69. struct Member {
  70. address member;
  71. string name;
  72. uint memberSince;
  73. }
  74.  
  75. struct Vote {
  76. bool inSupport;
  77. address voter;
  78. string justification;
  79. }
  80.  
  81. /* modifier that allows only shareholders to vote and create new proposals */
  82. modifier onlyMembers {
  83. if (memberId[msg.sender] == 0)
  84. throw;
  85. _;
  86. }
  87.  
  88. /* First time setup */
  89. function Congress(
  90. uint minimumQuorumForProposals,
  91. uint minutesForDebate,
  92. int marginOfVotesForMajority, address congressLeader
  93. ) payable {
  94. changeVotingRules(minimumQuorumForProposals, minutesForDebate, marginOfVotesForMajority);
  95. if (congressLeader != 0) owner = congressLeader;
  96. // It’s necessary to add an empty first member
  97. addMember(0, '');
  98. // and let's add the founder, to save a step later
  99. addMember(owner, 'founder');
  100. }
  101.  
  102. /*make member*/
  103. function addMember(address targetMember, string memberName) onlyOwner {
  104. uint id;
  105. if (memberId[targetMember] == 0) {
  106. memberId[targetMember] = members.length;
  107. id = members.length++;
  108. members[id] = Member({member: targetMember, memberSince: now, name: memberName});
  109. } else {
  110. id = memberId[targetMember];
  111. Member m = members[id];
  112. }
  113.  
  114. MembershipChanged(targetMember, true);
  115. }
  116.  
  117. function removeMember(address targetMember) onlyOwner {
  118. if (memberId[targetMember] == 0) throw;
  119.  
  120. for (uint i = memberId[targetMember]; i<members.length-1; i++){
  121. members[i] = members[i+1];
  122. }
  123. delete members[members.length-1];
  124. members.length--;
  125. }
  126.  
  127. /*change rules*/
  128. function changeVotingRules(
  129. uint minimumQuorumForProposals,
  130. uint minutesForDebate,
  131. int marginOfVotesForMajority
  132. ) onlyOwner {
  133. minimumQuorum = minimumQuorumForProposals;
  134. debatingPeriodInMinutes = minutesForDebate;
  135. majorityMargin = marginOfVotesForMajority;
  136.  
  137. ChangeOfRules(minimumQuorum, debatingPeriodInMinutes, majorityMargin);
  138. }
  139.  
  140. /* Function to create a new proposal */
  141. function newProposal(
  142. address beneficiary,
  143. uint etherAmount,
  144. string JobDescription,
  145. bytes transactionBytecode
  146. )
  147. onlyMembers
  148. returns (uint proposalID)
  149. {
  150. proposalID = proposals.length++;
  151. Proposal p = proposals[proposalID];
  152. p.recipient = beneficiary;
  153. p.amount = etherAmount;
  154. p.description = JobDescription;
  155. p.proposalHash = sha3(beneficiary, etherAmount, transactionBytecode);
  156. p.votingDeadline = now + debatingPeriodInMinutes * 1 minutes;
  157. p.executed = false;
  158. p.proposalPassed = false;
  159. p.numberOfVotes = 0;
  160. ProposalAdded(proposalID, beneficiary, etherAmount, JobDescription);
  161. numProposals = proposalID+1;
  162. }
  163.  
  164. /* function to check if a proposal code matches */
  165. function checkProposalCode(
  166. uint proposalNumber,
  167. address beneficiary,
  168. uint etherAmount,
  169. bytes transactionBytecode
  170. )
  171. constant
  172. returns (bool codeChecksOut)
  173. {
  174. Proposal p = proposals[proposalNumber];
  175. return p.proposalHash == sha3(beneficiary, etherAmount, transactionBytecode);
  176. }
  177.  
  178. function vote(
  179. uint proposalNumber,
  180. bool supportsProposal,
  181. string justificationText
  182. )
  183. onlyMembers
  184. returns (uint voteID)
  185. {
  186. Proposal p = proposals[proposalNumber]; // Get the proposal
  187. if (p.voted[msg.sender] == true) throw; // If has already voted, cancel
  188. p.voted[msg.sender] = true; // Set this voter as having voted
  189. p.numberOfVotes++; // Increase the number of votes
  190. if (supportsProposal) { // If they support the proposal
  191. p.currentResult++; // Increase score
  192. } else { // If they don't
  193. p.currentResult--; // Decrease the score
  194. }
  195. // Create a log of this event
  196. Voted(proposalNumber, supportsProposal, msg.sender, justificationText);
  197. }
  198.  
  199. function executeProposal(uint proposalNumber, bytes transactionBytecode) returns (int result) {
  200. Proposal p = proposals[proposalNumber];
  201. /* Check if the proposal can be executed:
  202. - Has the voting deadline arrived?
  203. - Has it been already executed or is it being executed?
  204. - Does the transaction code match the proposal?
  205. - Has a minimum quorum?
  206. */
  207.  
  208. if (now < p.votingDeadline
  209. || p.executed
  210. || p.proposalHash != sha3(p.recipient, p.amount, transactionBytecode)
  211. || p.numberOfVotes < minimumQuorum)
  212. throw;
  213.  
  214. /* execute result */
  215. /* If difference between support and opposition is larger than margin */
  216. if (p.currentResult > majorityMargin) {
  217. // Avoid recursive calling
  218.  
  219. p.executed = true;
  220. if (!p.recipient.call.value(p.amount * 1 ether)(transactionBytecode)) {
  221. throw;
  222. }
  223.  
  224. p.proposalPassed = true;
  225. } else {
  226. p.proposalPassed = false;
  227. }
  228. // Fire Events
  229. ProposalTallied(proposalNumber, p.currentResult, p.numberOfVotes, p.proposalPassed);
  230. }
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement