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> &gt;=0.4.22 &lt;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;">=&gt;</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;">&lt;</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;">&quot;Only chairperson can give right to vote.&quot;</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;">&quot;The voter already voted.&quot;</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;">&quot;You already voted.&quot;</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;">&quot;Self-delegation is disallowed.&quot;</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 &quot;stuck&quot; 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;">&quot;Found loop in delegation.&quot;</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;">&quot;Has no right to vote&quot;</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;">&quot;Already voted.&quot;</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;">&lt;</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;">&gt;</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>