Warning, file /frameworks/syntax-highlighting/autotests/html/test.sol.dark.html was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 <!DOCTYPE html> 0002 <html><head> 0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 0004 <title>test.sol</title> 0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (Solidity) - Theme (Breeze Dark)"/> 0006 </head><body style="background-color:#232629;color:#cfcfc2"><pre> 0007 <span style="color:#7a7c7d;">// Solidity Sample File</span> 0008 <span style="color:#7a7c7d;">// https://solidity.readthedocs.io/en/latest/solidity-by-example.html#voting</span> 0009 0010 <span style="font-weight:bold;">pragma</span> <span style="color:#7f8c8d;">solidity</span> >=0.4.22 <0.7.0; 0011 0012 <span style="color:#7a7c7d;">/// </span><span style="color:#3f8058;">@title</span><span style="color:#7a7c7d;"> Voting with delegation.</span> 0013 <span style="color:#fdbc4b;font-weight:bold;">contract</span> Ballot <span style="color:#3f8058;">{</span> 0014 <span style="color:#7a7c7d;">// This declares a new complex type which will</span> 0015 <span style="color:#7a7c7d;">// be used for variables later.</span> 0016 <span style="color:#7a7c7d;">// It will represent a single voter.</span> 0017 <span style="font-weight:bold;">struct</span> Voter <span style="color:#3f8058;">{</span> 0018 <span style="color:#2980b9;">uint</span> weight<span style="color:#3f8058;">;</span> <span style="color:#7a7c7d;">// weight is accumulated by delegation</span> 0019 <span style="color:#2980b9;">bool</span> voted<span style="color:#3f8058;">;</span> <span style="color:#7a7c7d;">// if true, that person already voted</span> 0020 <span style="color:#2980b9;">address</span> delegate<span style="color:#3f8058;">;</span> <span style="color:#7a7c7d;">// person delegated to</span> 0021 <span style="color:#2980b9;">uint</span> vote<span style="color:#3f8058;">;</span> <span style="color:#7a7c7d;">// index of the voted proposal</span> 0022 <span style="color:#3f8058;">}</span> 0023 0024 <span style="color:#7a7c7d;">// This is a type for a single proposal.</span> 0025 <span style="font-weight:bold;">struct</span> Proposal <span style="color:#3f8058;">{</span> 0026 <span style="color:#2980b9;">bytes32</span> name<span style="color:#3f8058;">;</span> <span style="color:#7a7c7d;">// short name (up to 32 bytes)</span> 0027 <span style="color:#2980b9;">uint</span> voteCount<span style="color:#3f8058;">;</span> <span style="color:#7a7c7d;">// number of accumulated votes</span> 0028 <span style="color:#3f8058;">}</span> 0029 0030 <span style="color:#2980b9;">address</span> <span style="font-weight:bold;">public</span> chairperson<span style="color:#3f8058;">;</span> 0031 0032 <span style="color:#7a7c7d;">// This declares a state variable that</span> 0033 <span style="color:#7a7c7d;">// stores a `Voter` struct for each possible address.</span> 0034 <span style="color:#2980b9;">mapping</span><span style="color:#3f8058;">(</span><span style="color:#2980b9;">address</span> <span style="color:#3f8058;">=></span> Voter<span style="color:#3f8058;">)</span> <span style="font-weight:bold;">public</span> voters<span style="color:#3f8058;">;</span> 0035 0036 <span style="color:#7a7c7d;">// A dynamically-sized array of `Proposal` structs.</span> 0037 Proposal<span style="color:#3f8058;">[]</span> <span style="font-weight:bold;">public</span> proposals<span style="color:#3f8058;">;</span> 0038 0039 <span style="color:#7a7c7d;">/// Create a new ballot to choose one of `proposalNames`.</span> 0040 <span style="color:#fdbc4b;font-weight:bold;">constructor</span><span style="color:#3f8058;">(</span><span style="color:#2980b9;">bytes32</span><span style="color:#3f8058;">[]</span> <span style="font-weight:bold;">memory</span> proposalNames<span style="color:#3f8058;">)</span> <span style="font-weight:bold;">public</span> <span style="color:#3f8058;">{</span> 0041 chairperson <span style="color:#3f8058;">=</span> <span style="color:#7f8c8d;">msg</span><span style="color:#3f8058;">.</span>sender<span style="color:#3f8058;">;</span> 0042 voters<span style="color:#3f8058;">[</span>chairperson<span style="color:#3f8058;">].</span>weight <span style="color:#3f8058;">=</span> <span style="color:#f67400;">1</span><span style="color:#3f8058;">;</span> 0043 0044 <span style="color:#7a7c7d;">// For each of the provided proposal names,</span> 0045 <span style="color:#7a7c7d;">// create a new proposal object and add it</span> 0046 <span style="color:#7a7c7d;">// to the end of the array.</span> 0047 <span style="color:#fdbc4b;font-weight:bold;">for</span> <span style="color:#3f8058;">(</span><span style="color:#2980b9;">uint</span> i <span style="color:#3f8058;">=</span> <span style="color:#f67400;">0</span><span style="color:#3f8058;">;</span> i <span style="color:#3f8058;"><</span> proposalNames<span style="color:#3f8058;">.</span>length<span style="color:#3f8058;">;</span> i<span style="color:#7f8c8d;">++</span><span style="color:#3f8058;">)</span> <span style="color:#3f8058;">{</span> 0048 <span style="color:#7a7c7d;">// `Proposal({...})` creates a temporary</span> 0049 <span style="color:#7a7c7d;">// Proposal object and `proposals.push(...)`</span> 0050 <span style="color:#7a7c7d;">// appends it to the end of `proposals`.</span> 0051 proposals<span style="color:#3f8058;">.</span>push<span style="color:#3f8058;">(</span>Proposal<span style="color:#3f8058;">({</span> 0052 name<span style="color:#3f8058;">:</span> proposalNames<span style="color:#3f8058;">[</span>i<span style="color:#3f8058;">],</span> 0053 voteCount<span style="color:#3f8058;">:</span> <span style="color:#f67400;">0</span> 0054 <span style="color:#3f8058;">}));</span> 0055 <span style="color:#3f8058;">}</span> 0056 <span style="color:#3f8058;">}</span> 0057 0058 <span style="color:#7a7c7d;">// Give `voter` the right to vote on this ballot.</span> 0059 <span style="color:#7a7c7d;">// May only be called by `chairperson`.</span> 0060 <span style="color:#fdbc4b;font-weight:bold;">function</span> giveRightToVote<span style="color:#3f8058;">(</span><span style="color:#2980b9;">address</span> voter<span style="color:#3f8058;">)</span> <span style="font-weight:bold;">public</span> <span style="color:#3f8058;">{</span> 0061 <span style="color:#7a7c7d;">// If the first argument of `require` evaluates</span> 0062 <span style="color:#7a7c7d;">// to `false`, execution terminates and all</span> 0063 <span style="color:#7a7c7d;">// changes to the state and to Ether balances</span> 0064 <span style="color:#7a7c7d;">// are reverted.</span> 0065 <span style="color:#7a7c7d;">// This used to consume all gas in old EVM versions, but</span> 0066 <span style="color:#7a7c7d;">// not anymore.</span> 0067 <span style="color:#7a7c7d;">// It is often a good idea to use `require` to check if</span> 0068 <span style="color:#7a7c7d;">// functions are called correctly.</span> 0069 <span style="color:#7a7c7d;">// As a second argument, you can also provide an</span> 0070 <span style="color:#7a7c7d;">// explanation about what went wrong.</span> 0071 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(</span> 0072 <span style="color:#7f8c8d;">msg</span><span style="color:#3f8058;">.</span>sender <span style="color:#3f8058;">==</span> chairperson<span style="color:#3f8058;">,</span> 0073 <span style="color:#f44f4f;">"Only chairperson can give right to vote."</span> 0074 <span style="color:#3f8058;">);</span> 0075 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(</span> 0076 <span style="color:#3f8058;">!</span>voters<span style="color:#3f8058;">[</span>voter<span style="color:#3f8058;">].</span>voted<span style="color:#3f8058;">,</span> 0077 <span style="color:#f44f4f;">"The voter already voted."</span> 0078 <span style="color:#3f8058;">);</span> 0079 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(</span>voters<span style="color:#3f8058;">[</span>voter<span style="color:#3f8058;">].</span>weight <span style="color:#3f8058;">==</span> <span style="color:#f67400;">0</span><span style="color:#3f8058;">);</span> 0080 voters<span style="color:#3f8058;">[</span>voter<span style="color:#3f8058;">].</span>weight <span style="color:#3f8058;">=</span> <span style="color:#f67400;">1</span><span style="color:#3f8058;">;</span> 0081 <span style="color:#3f8058;">}</span> 0082 0083 <span style="color:#7a7c7d;">/// Delegate your vote to the voter `to`.</span> 0084 <span style="color:#fdbc4b;font-weight:bold;">function</span> delegate<span style="color:#3f8058;">(</span><span style="color:#2980b9;">address</span> to<span style="color:#3f8058;">)</span> <span style="font-weight:bold;">public</span> <span style="color:#3f8058;">{</span> 0085 <span style="color:#7a7c7d;">// assigns reference</span> 0086 Voter <span style="font-weight:bold;">storage</span> sender <span style="color:#3f8058;">=</span> voters<span style="color:#3f8058;">[</span><span style="color:#7f8c8d;">msg</span><span style="color:#3f8058;">.</span>sender<span style="color:#3f8058;">];</span> 0087 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(!</span>sender<span style="color:#3f8058;">.</span>voted<span style="color:#3f8058;">,</span> <span style="color:#f44f4f;">"You already voted."</span><span style="color:#3f8058;">);</span> 0088 0089 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(</span>to <span style="color:#3f8058;">!=</span> <span style="color:#7f8c8d;">msg</span><span style="color:#3f8058;">.</span>sender<span style="color:#3f8058;">,</span> <span style="color:#f44f4f;">"Self-delegation is disallowed."</span><span style="color:#3f8058;">);</span> 0090 0091 <span style="color:#7a7c7d;">// Forward the delegation as long as</span> 0092 <span style="color:#7a7c7d;">// `to` also delegated.</span> 0093 <span style="color:#7a7c7d;">// In general, such loops are very dangerous,</span> 0094 <span style="color:#7a7c7d;">// because if they run too long, they might</span> 0095 <span style="color:#7a7c7d;">// need more gas than is available in a block.</span> 0096 <span style="color:#7a7c7d;">// In this case, the delegation will not be executed,</span> 0097 <span style="color:#7a7c7d;">// but in other situations, such loops might</span> 0098 <span style="color:#7a7c7d;">// cause a contract to get "stuck" completely.</span> 0099 <span style="color:#fdbc4b;font-weight:bold;">while</span> <span style="color:#3f8058;">(</span>voters<span style="color:#3f8058;">[</span>to<span style="color:#3f8058;">].</span>delegate <span style="color:#3f8058;">!=</span> <span style="color:#2980b9;">address</span><span style="color:#3f8058;">(</span><span style="color:#f67400;">0</span><span style="color:#3f8058;">))</span> <span style="color:#3f8058;">{</span> 0100 to <span style="color:#3f8058;">=</span> voters<span style="color:#3f8058;">[</span>to<span style="color:#3f8058;">].</span>delegate<span style="color:#3f8058;">;</span> 0101 0102 <span style="color:#7a7c7d;">// We found a loop in the delegation, not allowed.</span> 0103 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(</span>to <span style="color:#3f8058;">!=</span> <span style="color:#7f8c8d;">msg</span><span style="color:#3f8058;">.</span>sender<span style="color:#3f8058;">,</span> <span style="color:#f44f4f;">"Found loop in delegation."</span><span style="color:#3f8058;">);</span> 0104 <span style="color:#3f8058;">}</span> 0105 0106 <span style="color:#7a7c7d;">// Since `sender` is a reference, this</span> 0107 <span style="color:#7a7c7d;">// modifies `voters[msg.sender].voted`</span> 0108 sender<span style="color:#3f8058;">.</span>voted <span style="color:#3f8058;">=</span> <span style="font-weight:bold;">true</span><span style="color:#3f8058;">;</span> 0109 sender<span style="color:#3f8058;">.</span>delegate <span style="color:#3f8058;">=</span> to<span style="color:#3f8058;">;</span> 0110 Voter <span style="font-weight:bold;">storage</span> delegate_ <span style="color:#3f8058;">=</span> voters<span style="color:#3f8058;">[</span>to<span style="color:#3f8058;">];</span> 0111 <span style="color:#fdbc4b;font-weight:bold;">if</span> <span style="color:#3f8058;">(</span>delegate_<span style="color:#3f8058;">.</span>voted<span style="color:#3f8058;">)</span> <span style="color:#3f8058;">{</span> 0112 <span style="color:#7a7c7d;">// If the delegate already voted,</span> 0113 <span style="color:#7a7c7d;">// directly add to the number of votes</span> 0114 proposals<span style="color:#3f8058;">[</span>delegate_<span style="color:#3f8058;">.</span>vote<span style="color:#3f8058;">].</span>voteCount <span style="color:#3f8058;">+=</span> sender<span style="color:#3f8058;">.</span>weight<span style="color:#3f8058;">;</span> 0115 <span style="color:#3f8058;">}</span> <span style="color:#fdbc4b;font-weight:bold;">else</span> <span style="color:#3f8058;">{</span> 0116 <span style="color:#7a7c7d;">// If the delegate did not vote yet,</span> 0117 <span style="color:#7a7c7d;">// add to her weight.</span> 0118 delegate_<span style="color:#3f8058;">.</span>weight <span style="color:#3f8058;">+=</span> sender<span style="color:#3f8058;">.</span>weight<span style="color:#3f8058;">;</span> 0119 <span style="color:#3f8058;">}</span> 0120 <span style="color:#3f8058;">}</span> 0121 0122 <span style="color:#7a7c7d;">/// Give your vote (including votes delegated to you)</span> 0123 <span style="color:#7a7c7d;">/// to proposal `proposals[proposal].name`.</span> 0124 <span style="color:#fdbc4b;font-weight:bold;">function</span> vote<span style="color:#3f8058;">(</span><span style="color:#2980b9;">uint</span> proposal<span style="color:#3f8058;">)</span> <span style="font-weight:bold;">public</span> <span style="color:#3f8058;">{</span> 0125 Voter <span style="font-weight:bold;">storage</span> sender <span style="color:#3f8058;">=</span> voters<span style="color:#3f8058;">[</span><span style="color:#7f8c8d;">msg</span><span style="color:#3f8058;">.</span>sender<span style="color:#3f8058;">];</span> 0126 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(</span>sender<span style="color:#3f8058;">.</span>weight <span style="color:#3f8058;">!=</span> <span style="color:#f67400;">0</span><span style="color:#3f8058;">,</span> <span style="color:#f44f4f;">"Has no right to vote"</span><span style="color:#3f8058;">);</span> 0127 <span style="color:#7f8c8d;">require</span><span style="color:#3f8058;">(!</span>sender<span style="color:#3f8058;">.</span>voted<span style="color:#3f8058;">,</span> <span style="color:#f44f4f;">"Already voted."</span><span style="color:#3f8058;">);</span> 0128 sender<span style="color:#3f8058;">.</span>voted <span style="color:#3f8058;">=</span> <span style="font-weight:bold;">true</span><span style="color:#3f8058;">;</span> 0129 sender<span style="color:#3f8058;">.</span>vote <span style="color:#3f8058;">=</span> proposal<span style="color:#3f8058;">;</span> 0130 0131 <span style="color:#7a7c7d;">// If `proposal` is out of the range of the array,</span> 0132 <span style="color:#7a7c7d;">// this will throw automatically and revert all</span> 0133 <span style="color:#7a7c7d;">// changes.</span> 0134 proposals<span style="color:#3f8058;">[</span>proposal<span style="color:#3f8058;">].</span>voteCount <span style="color:#3f8058;">+=</span> sender<span style="color:#3f8058;">.</span>weight<span style="color:#3f8058;">;</span> 0135 <span style="color:#3f8058;">}</span> 0136 0137 <span style="color:#7a7c7d;">/// </span><span style="color:#3f8058;">@dev</span><span style="color:#7a7c7d;"> Computes the winning proposal taking all</span> 0138 <span style="color:#7a7c7d;">/// previous votes into account.</span> 0139 <span style="color:#fdbc4b;font-weight:bold;">function</span> winningProposal<span style="color:#3f8058;">()</span> <span style="font-weight:bold;">public</span> <span style="font-weight:bold;">view</span> 0140 <span style="font-weight:bold;">returns</span> <span style="color:#3f8058;">(</span><span style="color:#2980b9;">uint</span> winningProposal_<span style="color:#3f8058;">)</span> 0141 <span style="color:#3f8058;">{</span> 0142 <span style="color:#2980b9;">uint</span> winningVoteCount <span style="color:#3f8058;">=</span> <span style="color:#f67400;">0</span><span style="color:#3f8058;">;</span> 0143 <span style="color:#fdbc4b;font-weight:bold;">for</span> <span style="color:#3f8058;">(</span><span style="color:#2980b9;">uint</span> p <span style="color:#3f8058;">=</span> <span style="color:#f67400;">0</span><span style="color:#3f8058;">;</span> p <span style="color:#3f8058;"><</span> proposals<span style="color:#3f8058;">.</span>length<span style="color:#3f8058;">;</span> p<span style="color:#7f8c8d;">++</span><span style="color:#3f8058;">)</span> <span style="color:#3f8058;">{</span> 0144 <span style="color:#fdbc4b;font-weight:bold;">if</span> <span style="color:#3f8058;">(</span>proposals<span style="color:#3f8058;">[</span>p<span style="color:#3f8058;">].</span>voteCount <span style="color:#3f8058;">></span> winningVoteCount<span style="color:#3f8058;">)</span> <span style="color:#3f8058;">{</span> 0145 winningVoteCount <span style="color:#3f8058;">=</span> proposals<span style="color:#3f8058;">[</span>p<span style="color:#3f8058;">].</span>voteCount<span style="color:#3f8058;">;</span> 0146 winningProposal_ <span style="color:#3f8058;">=</span> p<span style="color:#3f8058;">;</span> 0147 <span style="color:#3f8058;">}</span> 0148 <span style="color:#3f8058;">}</span> 0149 <span style="color:#3f8058;">}</span> 0150 0151 <span style="color:#7a7c7d;">// Calls winningProposal() function to get the index</span> 0152 <span style="color:#7a7c7d;">// of the winner contained in the proposals array and then</span> 0153 <span style="color:#7a7c7d;">// returns the name of the winner</span> 0154 <span style="color:#fdbc4b;font-weight:bold;">function</span> winnerName<span style="color:#3f8058;">()</span> <span style="font-weight:bold;">public</span> <span style="font-weight:bold;">view</span> 0155 <span style="font-weight:bold;">returns</span> <span style="color:#3f8058;">(</span><span style="color:#2980b9;">bytes32</span> winnerName_<span style="color:#3f8058;">)</span> 0156 <span style="color:#3f8058;">{</span> 0157 winnerName_ <span style="color:#3f8058;">=</span> proposals<span style="color:#3f8058;">[</span>winningProposal<span style="color:#3f8058;">()].</span>name<span style="color:#3f8058;">;</span> 0158 <span style="color:#3f8058;">}</span> 0159 <span style="color:#3f8058;">}</span> 0160 </pre></body></html>