<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Program the Blockchain</title>
    <link>https://programtheblockchain.com/</link>
    <description>Recent content on Program the Blockchain</description>
    <language>en-us</language>
    <lastBuildDate>Mon, 10 Dec 2018 00:00:00 +0000</lastBuildDate>
    
        <atom:link href="https://programtheblockchain.com/rss.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Introduction to Ethereum Payment Channels Video</title>
      <link>https://programtheblockchain.com/posts/2018/12/10/introduction-to-ethereum-payment-channels-video/</link>
      <pubDate>Mon, 10 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/12/10/introduction-to-ethereum-payment-channels-video/</guid>
      <description>&lt;p&gt;We&amp;rsquo;ve created a short (32-minute) video to help explain Ethereum payment channels&amp;mdash;what they are and how they work.  This video complements two of our previous posts:
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;Writing a Simple Payment Channel&lt;/a&gt;
and
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/02/building-long-lived-payment-channels/&#34;&gt;Building Long-lived Payment Channels&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;


&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;//www.youtube.com/embed/d1oL_S1MNCI&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Implementing Harberger Tax Deeds</title>
      <link>https://programtheblockchain.com/posts/2018/09/19/implementing-harberger-tax-deeds/</link>
      <pubDate>Wed, 19 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/09/19/implementing-harberger-tax-deeds/</guid>
      <description>&lt;p&gt;This post will demonstrate how to implement deeds that collect a &amp;ldquo;Harberger tax&amp;rdquo;.  The recently published book,
&lt;a href=&#34;https://www.amazon.com/Radical-Markets-Uprooting-Capitalism-Democracy/dp/0691177503&#34;&gt;Radical Markets: Uprooting Capitalism and Democracy for a Just Society&lt;/a&gt;,
proposed Harberger taxes for a number of applications.  Since then Vitalik Buterin
(&lt;a href=&#34;https://vitalik.ca/general/2018/04/20/radical_markets.html&#34;&gt;here&lt;/a&gt;)
and Simon de la Rouviere
(&lt;a href=&#34;https://medium.com/@simondlr/what-is-harberger-tax-where-does-the-blockchain-fit-in-1329046922c6&#34;&gt;here&lt;/a&gt;)
have speculated on smart contract applicability.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A Harberger tax is a property tax that depends on an owner-determined, enforceable sales price.  For instance, suppose that there is a 5%/year Harberger tax on real estate, and Alice owns a parcel subject to this tax.  A Harberger tax regime requires Alice to state a price at which she is obligated to sell her parcel.  As a consequence, Alice will owe 5% of that sales price every year as a property tax, and her parcel will be for sale at her stated price.&lt;/p&gt;

&lt;p&gt;Obviously, Alice faces a tradeoff: higher prices create higher taxes but with less uncertainty about a future sale while lower prices create lower taxes with greater uncertainty about a future sale.  This tension provides incentives for Alice to set her taxes (by setting her sales price) reasonably.&lt;/p&gt;

&lt;h2 id=&#34;deed-tokens&#34;&gt;Deed Tokens&lt;/h2&gt;

&lt;p&gt;ERC20 token contracts create a supply of many fungible tokens&amp;mdash;tokens are indistinguishable from each other.  &amp;ldquo;Deed&amp;rdquo; tokens represent non-fungible tokens&amp;mdash;each token represents some right or privilege different from those of other deed tokens.  A popular example of deed tokens are the tokens that represent &amp;ldquo;&lt;a href=&#34;https://www.cryptokitties.co/&#34;&gt;CryptoKitties&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md&#34;&gt;ERC721&lt;/a&gt; defines a standard for non-fungible tokens, but this post will not implement to that standard. Not only are Harberger-taxed deed tokens not a good fit for ERC721, but ERC721 presents lots of details that will distract from the essence of this post (i.e., how to implement Harberger taxes correctly and efficiently).&lt;/p&gt;

&lt;p&gt;Our contract will track the account that receives tax payments, and the tax rate.  This contract has a daily tax rate given as a rational number.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;HarbergerTax&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Per day tax rate&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The contract tracks who owns each token, and the sales price the owner has set for that token.  Tokens are identified by integers, which are indexes into the &lt;code&gt;tokens&lt;/code&gt; array below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint96&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint48&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxDenominator&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;taxNumerator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;taxDenominator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;accounting-for-harberger-taxes&#34;&gt;Accounting for Harberger Taxes&lt;/h2&gt;

&lt;p&gt;Harberger taxes are conceptually simple: taxes are proportional to the selling price and the duration that the deed is held.  The contract will collect taxes on demand from prepaid balances maintained by deed holders.&lt;/p&gt;

&lt;p&gt;This contract will maintain per-account ether balances from which taxes will be collected for all deeds owned by each account.  This per-account balance design is in contrast to having per-deed balances.  Because a single account may potentially own many deeds, a per-account balance is simpler for deed owners to manage because they only need to deposit into one balance rather than one balance per deed.&lt;/p&gt;

&lt;p&gt;To collect taxes from an account, the contract must know the total of the sales prices of all deeds owned by each account and the time the taxes were paid through for that account.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint144&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint112&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The taxes due will be proportional to that total and the time that&amp;rsquo;s passed.  The contract also tracks each contract&amp;rsquo;s ether balance.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxesDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxNumerator&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxDenominator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Because the Ethereum VM does not check for overflows, a smart contract must guard against them.  Because &lt;code&gt;sumOfPrices&lt;/code&gt; is a &lt;code&gt;uint144&lt;/code&gt;, &lt;code&gt;taxRateNumerator&lt;/code&gt; is a &lt;code&gt;uint32&lt;/code&gt;, and &lt;code&gt;now&lt;/code&gt; is the number of seconds since a recent time, there&amp;rsquo;s no chance the multiplication above will overflow when computing a &lt;code&gt;uint256&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;maintaining-an-ether-balance&#34;&gt;Maintaining an Ether Balance&lt;/h2&gt;

&lt;p&gt;Taxes are collected in arrears, which means that they are collected for time that has passed since the last collection.  If adequate ether is not available when taxes are collected for an account, all that account&amp;rsquo;s tokens are at risk of being immediately foreclosed.  A simple function enables direct deposits.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In addition, most functions are &lt;code&gt;payable&lt;/code&gt;, which enables simultaneous deposits.&lt;/p&gt;

&lt;h2 id=&#34;foreclosure&#34;&gt;Foreclosure&lt;/h2&gt;

&lt;p&gt;When an account has no ether balance and is behind on taxes, the contract can foreclose on its tokens.  Foreclosure reverts ownership to &lt;code&gt;address(0)&lt;/code&gt; and sets the price to zero.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Change&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Possibly foreclose on token[id]&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;forecloseIfPossible&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Owner must be broke and behind on taxes to foreclose&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Change&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;collecting-taxes&#34;&gt;Collecting Taxes&lt;/h2&gt;

&lt;p&gt;Collecting taxes from an account with an adequate ether balance is straightforward.  The ether is transferred to the &lt;code&gt;taxRecipient&lt;/code&gt;, and the timestamp (&lt;code&gt;paidThru&lt;/code&gt;) is updated.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes due from account.&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return true if taxes fully paid, false otherwise&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxesDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint112&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// see below&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When there&amp;rsquo;s an inadequate balance, the contract collects the entire balance and adjusts the &lt;code&gt;paidThru&lt;/code&gt; timestamp &lt;em&gt;proportionally&lt;/em&gt;.  For instance, if the account owes three days of taxes, but the balance only covers two days worth, then the timestamp is adjusted forward by two days.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes due from account.&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return true if taxes fully paid, false otherwise&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxesDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// see above&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Adjust paidThru proportionally (overflow check unnecessary)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint112&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect entire balance for partially-paid taxes&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The routine also returns a &lt;code&gt;bool&lt;/code&gt; value that is &lt;code&gt;true&lt;/code&gt; if and only if the taxes were collected in full.&lt;/p&gt;

&lt;h2 id=&#34;buying-a-token&#34;&gt;Buying a Token&lt;/h2&gt;

&lt;p&gt;Buying tokens is parameterized by the token to be bought, the maximum price the &lt;code&gt;sender&lt;/code&gt; is willing to pay, and the sales price the buyer will accept in the future for the token.&lt;/p&gt;

&lt;p&gt;Before executing the sale, the contract first collects any taxes due from the seller and the buyer.  If the seller&amp;rsquo;s balance was insufficient to cover the seller&amp;rsquo;s taxes, then it is possible to foreclose on this token, which would make its price zero for the buyer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;max&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint96&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes from token&amp;#39;s owner and possibly foreclose on token[id].&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Foreclosure may change price and seller.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;forecloseIfPossible&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;max&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;price is too high&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes due from buyer before checking their balance&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;insufficient funds&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Transfer purchase price&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Adjust buyer&amp;#39;s and seller&amp;#39;s sumOfPrices&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Change&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notes on the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The maximum price is specified to guard against a buyer inadvertently buying a token whose price has increased between the time the buyer learned the (old) price and the time the transaction is actually accepted.&lt;/li&gt;
&lt;li&gt;Buying a property requires adjusting the buyer&amp;rsquo;s and the seller&amp;rsquo;s &lt;code&gt;sumOfPrices&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;changing-the-price&#34;&gt;Changing the Price&lt;/h2&gt;

&lt;p&gt;A token owner may want to change the token&amp;rsquo;s price, which will have the effect of changing future taxes.  The owner can do this by simply &lt;em&gt;buying&lt;/em&gt; the token (from their self) while specifying the new price.&lt;/p&gt;

&lt;h2 id=&#34;withdrawing-ether&#34;&gt;Withdrawing Ether&lt;/h2&gt;

&lt;p&gt;Accounts can withdraw ether, but only after paying any past taxes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;insufficient funds&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;changing-the-tax-recipient&#34;&gt;Changing the Tax Recipient&lt;/h2&gt;

&lt;p&gt;This contract adopts the approve/transfer pattern for changing the tax recipient.  The current recipient designates the new recipient, and the new recipient transfers the role to itself.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approveRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;must be taxRecipient&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;must be approved&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The current recipient can change approvals prior to a transfer with a subsequent call to &lt;code&gt;approveRecipient&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Deed tokens represent non-fungible rights/privileges.&lt;/li&gt;
&lt;li&gt;Harberger-taxed tokens can be implemented simply with a smart contract, which manages tax collection and token sales.&lt;/li&gt;
&lt;li&gt;This implementation relies on per-account bookkeeping to compute and collect taxes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;harberger.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7Cgpjb250cmFjdCBIYXJiZXJnZXJUYXggewogICAgYWRkcmVzcyBwdWJsaWMgdGF4UmVjaXBpZW50OwoKICAgIC8vIFBlciBkYXkgdGF4IHJhdGUKICAgIHVpbnQzMiBwdWJsaWMgdGF4TnVtZXJhdG9yOwogICAgdWludDMyIHB1YmxpYyB0YXhEZW5vbWluYXRvcjsKCiAgICBzdHJ1Y3QgVG9rZW4gewogICAgICAgIGFkZHJlc3Mgb3duZXI7CiAgICAgICAgdWludDk2IHByaWNlOwogICAgfQoKICAgIFRva2VuW10gcHVibGljIHRva2VuczsKCiAgICBjb25zdHJ1Y3RvcigKICAgICAgICB1aW50NDggbnVtYmVyT2ZUb2tlbnMsCiAgICAgICAgdWludDMyIF90YXhOdW1lcmF0b3IsCiAgICAgICAgdWludDMyIF90YXhEZW5vbWluYXRvcgogICAgKSBwdWJsaWMgewogICAgICAgIHRheFJlY2lwaWVudCA9IG1zZy5zZW5kZXI7CiAgICAgICAgdG9rZW5zLmxlbmd0aCA9IG51bWJlck9mVG9rZW5zOwogICAgICAgIHRheE51bWVyYXRvciA9IF90YXhOdW1lcmF0b3I7CiAgICAgICAgdGF4RGVub21pbmF0b3IgPSBfdGF4RGVub21pbmF0b3I7CiAgICB9CgogICAgc3RydWN0IEFjY291bnQgewogICAgICAgIHVpbnQyNTYgYmFsYW5jZTsKICAgICAgICB1aW50MTQ0IHN1bU9mUHJpY2VzOwogICAgICAgIHVpbnQxMTIgcGFpZFRocnU7CiAgICB9CgogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IEFjY291bnQpIHB1YmxpYyBhY2NvdW50czsKCiAgICBmdW5jdGlvbiB0YXhlc0R1ZShhZGRyZXNzIGFkZHIpIHB1YmxpYyB2aWV3IHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICBBY2NvdW50IHN0b3JhZ2UgYSA9IGFjY291bnRzW2FkZHJdOwoKICAgICAgICByZXR1cm4gYS5zdW1PZlByaWNlcyAqIChub3cgLSBhLnBhaWRUaHJ1KSAqIHRheE51bWVyYXRvcgogICAgICAgICAgICAvIHRheERlbm9taW5hdG9yIC8gMSBkYXlzOwogICAgfQoKICAgIGV2ZW50IENoYW5nZSh1aW50MjU2IGluZGV4ZWQgaWQsIGFkZHJlc3MgaW5kZXhlZCB0bywgYWRkcmVzcyBpbmRleGVkIGZyb20pOwoKICAgIC8vIFBvc3NpYmx5IGZvcmVjbG9zZSBvbiB0b2tlbltpZF0KICAgIGZ1bmN0aW9uIGZvcmVjbG9zZUlmUG9zc2libGUodWludDI1NiBpZCkgcHVibGljIHsKICAgICAgICBUb2tlbiBzdG9yYWdlIHQgPSB0b2tlbnNbaWRdOwogICAgICAgIEFjY291bnQgc3RvcmFnZSBhID0gYWNjb3VudHNbdC5vd25lcl07CgogICAgICAgIC8vIE93bmVyIG11c3QgYmUgYnJva2UgYW5kIGJlaGluZCBvbiB0YXhlcyB0byBmb3JlY2xvc2UKICAgICAgICBpZiAoYS5iYWxhbmNlID09IDAgJiYgYS5wYWlkVGhydSA8IG5vdyAmJiBhLnN1bU9mUHJpY2VzID4gMCkgewogICAgICAgICAgICBhLnN1bU9mUHJpY2VzIC09IHQucHJpY2U7CiAgICAgICAgICAgIGVtaXQgQ2hhbmdlKGlkLCAwLCB0Lm93bmVyKTsKICAgICAgICAgICAgZGVsZXRlKHRva2Vuc1tpZF0pOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBDb2xsZWN0IHRheGVzIGR1ZSBmcm9tIGFjY291bnQuCiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0YXhlcyBmdWxseSBwYWlkLCBmYWxzZSBvdGhlcndpc2UKICAgIGZ1bmN0aW9uIGNvbGxlY3RUYXhlcyhhZGRyZXNzIGFkZHIpIHB1YmxpYyByZXR1cm5zIChib29sKSB7CiAgICAgICAgQWNjb3VudCBzdG9yYWdlIGEgPSBhY2NvdW50c1thZGRyXTsKCiAgICAgICAgdWludDI1NiB0YXhlcyA9IHRheGVzRHVlKGFkZHIpOwogICAgICAgIGlmICh0YXhlcyA8PSBhLmJhbGFuY2UpIHsKICAgICAgICAgICAgYS5wYWlkVGhydSA9IHVpbnQxMTIobm93KTsKICAgICAgICAgICAgYWNjb3VudHNbdGF4UmVjaXBpZW50XS5iYWxhbmNlICs9IHRheGVzOwogICAgICAgICAgICBhLmJhbGFuY2UgLT0gdGF4ZXM7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEFkanVzdCBwYWlkVGhydSBwcm9wb3J0aW9uYWxseSAob3ZlcmZsb3cgY2hlY2sgdW5uZWNlc3NhcnkpCiAgICAgICAgICAgIGEucGFpZFRocnUgKz0gdWludDExMigobm93IC0gYS5wYWlkVGhydSkgKiBhLmJhbGFuY2UgLyB0YXhlcyk7CgogICAgICAgICAgICAvLyBDb2xsZWN0IGVudGlyZSBiYWxhbmNlIGZvciBwYXJ0aWFsbHktcGFpZCB0YXhlcwogICAgICAgICAgICBhY2NvdW50c1t0YXhSZWNpcGllbnRdLmJhbGFuY2UgKz0gYS5iYWxhbmNlOwogICAgICAgICAgICBhLmJhbGFuY2UgPSAwOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFRyeSB0byBidXkgdG9rZW4gZm9yIG5vIG1vcmUgdGhhbiAnbWF4JwogICAgZnVuY3Rpb24gYnV5KAogICAgICAgIHVpbnQyNTYgaWQsCiAgICAgICAgdWludDI1NiBtYXgsCiAgICAgICAgdWludDk2IHByaWNlCiAgICApCiAgICAgICAgcHVibGljCiAgICAgICAgcGF5YWJsZQogICAgewogICAgICAgIGFjY291bnRzW21zZy5zZW5kZXJdLmJhbGFuY2UgKz0gbXNnLnZhbHVlOwoKICAgICAgICBUb2tlbiBzdG9yYWdlIHQgPSB0b2tlbnNbaWRdOwoKICAgICAgICAvLyBDb2xsZWN0IHRheGVzIGZyb20gdG9rZW4ncyBvd25lciBhbmQgcG9zc2libHkgZm9yZWNsb3NlIG9uIHRva2VuW2lkXS4KICAgICAgICBjb2xsZWN0VGF4ZXModC5vd25lcik7CgogICAgICAgIC8vIEZvcmVjbG9zdXJlIG1heSBjaGFuZ2UgcHJpY2UgYW5kIHNlbGxlci4KICAgICAgICBmb3JlY2xvc2VJZlBvc3NpYmxlKGlkKTsKICAgICAgICBhZGRyZXNzIHNlbGxlciA9IHQub3duZXI7CgogICAgICAgIGlmIChzZWxsZXIgIT0gbXNnLnNlbmRlcikgewogICAgICAgICAgICByZXF1aXJlKG1heCA&amp;#43;PSB0LnByaWNlLCAicHJpY2UgaXMgdG9vIGhpZ2giKTsKCiAgICAgICAgICAgIC8vIENvbGxlY3QgdGF4ZXMgZHVlIGZyb20gYnV5ZXIgYmVmb3JlIGNoZWNraW5nIHRoZWlyIGJhbGFuY2UKICAgICAgICAgICAgY29sbGVjdFRheGVzKG1zZy5zZW5kZXIpOwogICAgICAgICAgICByZXF1aXJlKGFjY291bnRzW21zZy5zZW5kZXJdLmJhbGFuY2UgPj0gdC5wcmljZSwKICAgICAgICAgICAgICAgICJpbnN1ZmZpY2llbnQgZnVuZHMiKTsKCiAgICAgICAgICAgIC8vIFRyYW5zZmVyIHB1cmNoYXNlIHByaWNlCiAgICAgICAgICAgIGFjY291bnRzW3NlbGxlcl0uYmFsYW5jZSArPSB0LnByaWNlOwogICAgICAgICAgICBhY2NvdW50c1ttc2cuc2VuZGVyXS5iYWxhbmNlIC09IHQucHJpY2U7CgogICAgICAgICAgICB0Lm93bmVyID0gbXNnLnNlbmRlcjsKICAgICAgICB9CiAgICAgICAgLy8gQWRqdXN0IGJ1eWVyJ3MgYW5kIHNlbGxlcidzIHN1bU9mUHJpY2VzCiAgICAgICAgYWNjb3VudHNbc2VsbGVyXS5zdW1PZlByaWNlcyAtPSB0LnByaWNlOwogICAgICAgIGFjY291bnRzW21zZy5zZW5kZXJdLnN1bU9mUHJpY2VzICs9IHByaWNlOwoKICAgICAgICB0LnByaWNlID0gcHJpY2U7CgogICAgICAgIGVtaXQgQ2hhbmdlKGlkLCBtc2cuc2VuZGVyLCBzZWxsZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlcG9zaXQoKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgYWNjb3VudHNbbXNnLnNlbmRlcl0uYmFsYW5jZSArPSBtc2cudmFsdWU7CiAgICB9CgogICAgZnVuY3Rpb24gd2l0aGRyYXcodWludDI1NiBhbW91bnQpIHB1YmxpYyB7CiAgICAgICAgY29sbGVjdFRheGVzKG1zZy5zZW5kZXIpOwoKICAgICAgICByZXF1aXJlKGFjY291bnRzW21zZy5zZW5kZXJdLmJhbGFuY2UgPj0gYW1vdW50LCAiaW5zdWZmaWNpZW50IGZ1bmRzIik7CgogICAgICAgIGFjY291bnRzW21zZy5zZW5kZXJdLmJhbGFuY2UgLT0gYW1vdW50OwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkNvdW50KCkgcHVibGljIHZpZXcgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJldHVybiB0b2tlbnMubGVuZ3RoOwogICAgfQoKICAgIGFkZHJlc3MgcHVibGljIG5ld1JlY2lwaWVudDsKCiAgICBmdW5jdGlvbiBhcHByb3ZlUmVjaXBpZW50KGFkZHJlc3MgX25ld1JlY2lwaWVudCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gdGF4UmVjaXBpZW50LCAibXVzdCBiZSB0YXhSZWNpcGllbnQiKTsKICAgICAgICBuZXdSZWNpcGllbnQgPSBfbmV3UmVjaXBpZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyUmVjaXBpZW50KCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gbmV3UmVjaXBpZW50LCAibXVzdCBiZSBhcHByb3ZlZCIpOwogICAgICAgIHRheFJlY2lwaWVudCA9IG1zZy5zZW5kZXI7CiAgICAgICAgbmV3UmVjaXBpZW50ID0gMDsKICAgIH0KfQo=&#34; download=&#39;harberger.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;HarbergerTax&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Per day tax rate&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint96&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint48&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxDenominator&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;taxNumerator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;taxDenominator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_taxDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint144&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint112&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxesDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxNumerator&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxDenominator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Change&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Possibly foreclose on token[id]&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;forecloseIfPossible&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Owner must be broke and behind on taxes to foreclose&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Change&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes due from account.&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return true if taxes fully paid, false otherwise&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Account&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxesDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint112&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Adjust paidThru proportionally (overflow check unnecessary)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint112&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;paidThru&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect entire balance for partially-paid taxes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Try to buy token for no more than &amp;#39;max&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;max&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint96&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes from token&amp;#39;s owner and possibly foreclose on token[id].&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Foreclosure may change price and seller.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;forecloseIfPossible&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;max&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;price is too high&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Collect taxes due from buyer before checking their balance&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;insufficient funds&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Transfer purchase price&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

            &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Adjust buyer&amp;#39;s and seller&amp;#39;s sumOfPrices&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sumOfPrices&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Change&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collectTaxes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;insufficient funds&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approveRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;must be taxRecipient&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;must be approved&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;taxRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;newRecipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Dollar Auction Contract</title>
      <link>https://programtheblockchain.com/posts/2018/08/16/writing-a-dollar-auction-contract/</link>
      <pubDate>Thu, 16 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/08/16/writing-a-dollar-auction-contract/</guid>
      <description>&lt;p&gt;This post will implement a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Dollar_auction&#34;&gt;&amp;ldquo;dollar auction&amp;rdquo;&lt;/a&gt;
contract for ERC20 tokens. It will be a modest change to the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;English auction contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A dollar auction requires that the highest and second-highest bidders each pay their bid amounts, although only the highest bidder receives the bid-for prize.  (Originally, dollar auctions were so-named because it was a dollar bill that was being auctioned.  Their fundamental characteristic, however, is the risk of being the second-highest bidder and getting nothing for your bid.)&lt;/p&gt;

&lt;p&gt;Dollar auctions are not really practical for anything other than
&lt;a href=&#34;https://en.wikipedia.org/wiki/Dollar_auction&#34;&gt;demonstrating how irrational people can be&lt;/a&gt;.
They are, however, well-defined and relatively simple, so they make a good subject for implementation as a smart contract.&lt;/p&gt;

&lt;h2 id=&#34;auction-state&#34;&gt;Auction State&lt;/h2&gt;

&lt;p&gt;Like our &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;English Auction contract&lt;/a&gt;, the penny auction contract will auction off tokens, and the auction ends after no bids have been received for a given timeout period.&lt;/p&gt;

&lt;p&gt;Unlike the English auction, the dollar auction keeps track of the top two highest bids. This dollar auction does not have a reserve price.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DollarAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The constructor initializes &lt;code&gt;highBidder&lt;/code&gt; to the seller&amp;rsquo;s account to simplify handling the case where there are no bids.&lt;/p&gt;

&lt;h2 id=&#34;ether-balances&#34;&gt;Ether Balances&lt;/h2&gt;

&lt;p&gt;Like the English Auction contract, this contract will keep track of every account&amp;rsquo;s available ether balance:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;bidding&#34;&gt;Bidding&lt;/h2&gt;

&lt;p&gt;Bidding in a dollar auction requires tracking the top two highest bids and adjusting all of the ether balances appropriately.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increase&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increase&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;secondBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;secondBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above merits some explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The initial &lt;code&gt;require&lt;/code&gt; statements make sure that a bid is acceptable.&lt;/li&gt;
&lt;li&gt;The bulk of the code adjusts the ether balances to account for the previous high bidder now being the second-highest bidder.  It&amp;rsquo;s worth noting that all of the adjustments to &lt;code&gt;balanceOf&lt;/code&gt; offset each other.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;seller&lt;/code&gt;&amp;rsquo;s balance is updated by the increase of the current bid over the &lt;em&gt;second-highest&lt;/em&gt; bid.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;require(balanceOf[msg.sender] &amp;gt;= amount);&lt;/code&gt; statement could not have been placed with the earlier &lt;code&gt;require&lt;/code&gt; statements because it&amp;rsquo;s possible that &lt;code&gt;msg.sender&lt;/code&gt; was the previous second-highest bidder.  In that case, the sender&amp;rsquo;s ether balance wouldn&amp;rsquo;t be accurate until after &lt;code&gt;secondBidder&lt;/code&gt;&amp;rsquo;s balance is updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;claiming-tokens&#34;&gt;Claiming Tokens&lt;/h2&gt;

&lt;p&gt;The winning bidder claims their tokens with &lt;code&gt;resolve&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Smart contracts can easily implement &amp;ldquo;dollar auctions&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Dollar auctions are similar to English auctions, with the added complication of tracking the second-highest bidder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;dollar.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgIi4uL2NvbW1vbi9pZXJjMjB0b2tlbi5zb2wiOwoKY29udHJhY3QgRG9sbGFyQXVjdGlvbiB7CiAgICBhZGRyZXNzIHB1YmxpYyBzZWxsZXI7CgogICAgSUVSQzIwVG9rZW4gcHVibGljIHRva2VuOwogICAgdWludDI1NiBwdWJsaWMgbWluSW5jcmVtZW50OwogICAgdWludDI1NiBwdWJsaWMgdGltZW91dFBlcmlvZDsKCiAgICB1aW50MjU2IHB1YmxpYyBhdWN0aW9uRW5kOwoKICAgIGFkZHJlc3MgcHVibGljIGhpZ2hCaWRkZXI7CiAgICB1aW50MjU2IHB1YmxpYyBoaWdoQmlkOwoKICAgIGFkZHJlc3MgcHVibGljIHNlY29uZEJpZGRlcjsKICAgIHVpbnQyNTYgcHVibGljIHNlY29uZEJpZDsKCiAgICBjb25zdHJ1Y3RvcigKICAgICAgICBJRVJDMjBUb2tlbiBfdG9rZW4sCiAgICAgICAgdWludDI1NiBfbWluSW5jcmVtZW50LAogICAgICAgIHVpbnQyNTYgX3RpbWVvdXRQZXJpb2QKICAgICkKICAgICAgICBwdWJsaWMKICAgIHsKICAgICAgICB0b2tlbiA9IF90b2tlbjsKICAgICAgICBtaW5JbmNyZW1lbnQgPSBfbWluSW5jcmVtZW50OwogICAgICAgIHRpbWVvdXRQZXJpb2QgPSBfdGltZW91dFBlcmlvZDsKCiAgICAgICAgc2VsbGVyID0gbXNnLnNlbmRlcjsKICAgICAgICBhdWN0aW9uRW5kID0gbm93ICsgdGltZW91dFBlcmlvZDsKICAgICAgICBoaWdoQmlkZGVyID0gc2VsbGVyOwogICAgfQoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgYmFsYW5jZU9mOwoKICAgIGZ1bmN0aW9uIHdpdGhkcmF3KCkgcHVibGljIHsKICAgICAgICB1aW50MjU2IGFtb3VudCA9IGJhbGFuY2VPZlttc2cuc2VuZGVyXTsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPSAwOwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KCiAgICBldmVudCBCaWQoYWRkcmVzcyBoaWdoQmlkZGVyLCB1aW50MjU2IGhpZ2hCaWQpOwoKICAgIGZ1bmN0aW9uIGJpZCh1aW50MjU2IGFtb3VudCkgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUobm93IDwgYXVjdGlvbkVuZCk7CiAgICAgICAgcmVxdWlyZShhbW91bnQgPj0gaGlnaEJpZCttaW5JbmNyZW1lbnQpOwogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciAhPSBoaWdoQmlkZGVyKTsKCiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdICs9IG1zZy52YWx1ZTsKCiAgICAgICAgdWludDI1NiBpbmNyZWFzZSA9IGFtb3VudCAtIHNlY29uZEJpZDsKICAgICAgICBiYWxhbmNlT2Zbc2VsbGVyXSArPSBpbmNyZWFzZTsKICAgICAgICBiYWxhbmNlT2Zbc2Vjb25kQmlkZGVyXSArPSBzZWNvbmRCaWQ7CiAgICAgICAgcmVxdWlyZShiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPj0gYW1vdW50KTsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gLT0gYW1vdW50OwogICAgICAgIHNlY29uZEJpZCA9IGhpZ2hCaWQ7CiAgICAgICAgc2Vjb25kQmlkZGVyID0gaGlnaEJpZGRlcjsKCiAgICAgICAgaGlnaEJpZGRlciA9IG1zZy5zZW5kZXI7CiAgICAgICAgaGlnaEJpZCA9IGFtb3VudDsKICAgICAgICBhdWN0aW9uRW5kID0gbm93ICsgdGltZW91dFBlcmlvZDsKICAgICAgICBlbWl0IEJpZChoaWdoQmlkZGVyLCBhbW91bnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGF1Y3Rpb25FbmQpOwoKICAgICAgICB1aW50MjU2IHQgPSB0b2tlbi5iYWxhbmNlT2YodGhpcyk7CiAgICAgICAgcmVxdWlyZSh0b2tlbi50cmFuc2ZlcihoaWdoQmlkZGVyLCB0KSk7CiAgICB9Cn0K&#34; download=&#39;dollar.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;../common/ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DollarAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increase&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increase&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;secondBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;secondBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Penny Auction Contract</title>
      <link>https://programtheblockchain.com/posts/2018/08/08/writing-a-penny-auction-contract/</link>
      <pubDate>Wed, 08 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/08/08/writing-a-penny-auction-contract/</guid>
      <description>&lt;p&gt;This post will implement a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Bidding_fee_auction&#34;&gt;bidding fee auction&lt;/a&gt;
(aka &amp;ldquo;penny auction&amp;rdquo;) contract for ERC20 tokens. It will be a modest change to the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;English auction contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Penny auctions are an interesting twist on typical English auctions.  In an English auction, bidders can bid any amount greater than the last high bid subject to some minimum increment.  And, there is no fee to bid.&lt;/p&gt;

&lt;p&gt;In a penny auction, bids are restricted to a fixed increment over the current high bid, and there is a fee to bid.  Typically, the increments are small relative to the fee.  For instance, the increment might be a penny and the fee a dollar.&lt;/p&gt;

&lt;h2 id=&#34;auction-state&#34;&gt;Auction State&lt;/h2&gt;

&lt;p&gt;Like our &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;English Auction contract&lt;/a&gt;, the penny auction contract will auction off tokens, and the auction ends after no bids have been received for a given timeout period.&lt;/p&gt;

&lt;p&gt;Unlike the English auction, the penny auction collects a fee for each bid and enforces a fixed bid increment. This penny auction does not have a reserve price.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PennyAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The constructor initializes &lt;code&gt;highBidder&lt;/code&gt; to the seller&amp;rsquo;s account to simplify handling the case where there are no bids.&lt;/p&gt;

&lt;h2 id=&#34;ether-balances&#34;&gt;Ether Balances&lt;/h2&gt;

&lt;p&gt;Like the English Auction contract, this contract will keep track of every account&amp;rsquo;s available ether balance:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;bidding&#34;&gt;Bidding&lt;/h2&gt;

&lt;p&gt;Processing penny auction bids is straightforward:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A few notable things about the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The bulk of the work is in adjusting the ether balances for the seller, the previous high bidder and the sender (new high bidder).&lt;/li&gt;
&lt;li&gt;The ether adjustments transfer the increment and the fee to the seller, which means that ether is available for withdrawal immediately.&lt;/li&gt;
&lt;li&gt;The contract doesn&amp;rsquo;t allow a bidder to bid against themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;claiming-tokens&#34;&gt;Claiming Tokens&lt;/h2&gt;

&lt;p&gt;The winning bidder claims their tokens with &lt;code&gt;resolve&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Penny auctions are similar to English auctions with the addition of a bid fee and a fixed bid increment.&lt;/li&gt;
&lt;li&gt;The English auction contract requires only slight modification to support a penny auction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;penny.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IFBlbm55QXVjdGlvbiB7CiAgICBhZGRyZXNzIHNlbGxlcjsKCiAgICBJRVJDMjBUb2tlbiBwdWJsaWMgdG9rZW47CiAgICB1aW50MjU2IHB1YmxpYyBiaWRJbmNyZW1lbnQ7CiAgICB1aW50MjU2IHB1YmxpYyB0aW1lb3V0UGVyaW9kOwogICAgdWludDI1NiBwdWJsaWMgYmlkRmVlOwoKICAgIHVpbnQyNTYgcHVibGljIGF1Y3Rpb25FbmQ7CgogICAgYWRkcmVzcyBwdWJsaWMgaGlnaEJpZGRlcjsKICAgIHVpbnQyNTYgcHVibGljIGhpZ2hCaWQ7CgogICAgY29uc3RydWN0b3IoCiAgICAgICAgSUVSQzIwVG9rZW4gX3Rva2VuLAogICAgICAgIHVpbnQyNTYgX2JpZEluY3JlbWVudCwKICAgICAgICB1aW50MjU2IF9iaWRGZWUsCiAgICAgICAgdWludDI1NiBfdGltZW91dFBlcmlvZAogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIHRva2VuID0gX3Rva2VuOwogICAgICAgIGJpZEluY3JlbWVudCA9IF9iaWRJbmNyZW1lbnQ7CiAgICAgICAgYmlkRmVlID0gX2JpZEZlZTsKICAgICAgICB0aW1lb3V0UGVyaW9kID0gX3RpbWVvdXRQZXJpb2Q7CgogICAgICAgIHNlbGxlciA9IG1zZy5zZW5kZXI7CiAgICAgICAgYXVjdGlvbkVuZCA9IG5vdyArIHRpbWVvdXRQZXJpb2Q7CiAgICAgICAgaGlnaEJpZGRlciA9IHNlbGxlcjsKICAgIH0KCiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gdWludDI1NikgcHVibGljIGJhbGFuY2VPZjsKCiAgICBmdW5jdGlvbiB3aXRoZHJhdygpIHB1YmxpYyB7CiAgICAgICAgdWludDI1NiBhbW91bnQgPSBiYWxhbmNlT2ZbbXNnLnNlbmRlcl07CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9CgogICAgZXZlbnQgQmlkKGFkZHJlc3MgaGlnaEJpZGRlciwgdWludDI1NiBoaWdoQmlkKTsKCiAgICBmdW5jdGlvbiBiaWQoKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShub3cgPCBhdWN0aW9uRW5kKTsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgIT0gaGlnaEJpZGRlcik7CgogICAgICAgIGJhbGFuY2VPZlttc2cuc2VuZGVyXSArPSBtc2cudmFsdWU7CgogICAgICAgIHJlcXVpcmUoYmFsYW5jZU9mW21zZy5zZW5kZXJdID49IGhpZ2hCaWQgKyBiaWRJbmNyZW1lbnQgKyBiaWRGZWUpOwoKICAgICAgICBiYWxhbmNlT2Zbc2VsbGVyXSArPSBiaWRJbmNyZW1lbnQgKyBiaWRGZWU7CiAgICAgICAgYmFsYW5jZU9mW2hpZ2hCaWRkZXJdICs9IGhpZ2hCaWQ7CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdIC09IGhpZ2hCaWQgKyBiaWRJbmNyZW1lbnQgKyBiaWRGZWU7CgogICAgICAgIGhpZ2hCaWQgKz0gYmlkSW5jcmVtZW50OwogICAgICAgIGhpZ2hCaWRkZXIgPSBtc2cuc2VuZGVyOwogICAgICAgIGF1Y3Rpb25FbmQgPSBub3cgKyB0aW1lb3V0UGVyaW9kOwogICAgICAgIGVtaXQgQmlkKGhpZ2hCaWRkZXIsIGhpZ2hCaWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGF1Y3Rpb25FbmQpOwoKICAgICAgICB1aW50MjU2IHQgPSB0b2tlbi5iYWxhbmNlT2YodGhpcyk7CiAgICAgICAgcmVxdWlyZSh0b2tlbi50cmFuc2ZlcihoaWdoQmlkZGVyLCB0KSk7CiAgICB9Cn0K&#34; download=&#39;penny.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PennyAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidFee&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bidIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Contracts Calling Arbitrary Functions</title>
      <link>https://programtheblockchain.com/posts/2018/08/02/contracts-calling-arbitrary-functions/</link>
      <pubDate>Thu, 02 Aug 2018 08:58:52 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/08/02/contracts-calling-arbitrary-functions/</guid>
      <description>

&lt;p&gt;Solidity offers convenient high-level syntax for calling functions in other contracts, but this high-level syntax is only available when the target contract&amp;rsquo;s interface is known at compile time.&lt;/p&gt;

&lt;p&gt;In this post, I&amp;rsquo;ll show how smart contracts can use &lt;a href=&#34;https://programtheblockchain.com/posts/2018/07/25/anatomy-of-transaction-data/&#34;&gt;low-level message passing&lt;/a&gt; to make arbitrary calls into other contracts. I&amp;rsquo;ll use this mechanism to enhance our &lt;a href=&#34;https://programtheblockchain.com/posts/2018/07/11/writing-a-trivial-multisig-wallet/&#34;&gt;trivial multisig wallet&lt;/a&gt; so that it can make function calls in addition to transferring ether.&lt;/p&gt;

&lt;h2 id=&#34;high-level-function-call-syntax&#34;&gt;High-Level Function Call Syntax&lt;/h2&gt;

&lt;p&gt;Before diving into the low-level mechanism, it&amp;rsquo;s worth reviewing Solidity&amp;rsquo;s high-level syntax for &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.24/control-structures.html#external-function-calls&#34;&gt;calling out to another contract&lt;/a&gt;. We&amp;rsquo;ve used this mechanism many times on this blog already. Here&amp;rsquo;s a very abridged example from our post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/07/06/performing-multiple-actions-transactionally/&#34;&gt;Performing Multiple Actions Transactionally&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Arbitrage&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The line &lt;code&gt;sellShop.sell(amount)&lt;/code&gt; is where the external call happens. The Solidity compiler translates this high-level function call into low-level message passing. This is possible because the interface for &lt;code&gt;ITokenShop&lt;/code&gt; is known at compile time, so the appropriate encoding logic can be emitted by the compiler.&lt;/p&gt;

&lt;h2 id=&#34;the-low-level-call-function&#34;&gt;The Low-Level &lt;code&gt;call()&lt;/code&gt; Function&lt;/h2&gt;

&lt;p&gt;When the interface of the target contract is &lt;em&gt;not&lt;/em&gt; known at compile time, Solidity&amp;rsquo;s high-level syntax is unavailable. For these scenarios, the &lt;code&gt;address&lt;/code&gt; type includes a &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.24/types.html#members-of-addresses&#34;&gt;&lt;code&gt;call()&lt;/code&gt;&lt;/a&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;call()&lt;/code&gt; accepts the raw message that is passed to the target contract&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. I showed how message data is constructed in my post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/07/25/anatomy-of-transaction-data/&#34;&gt;Anatomy of Transaction Data&lt;/a&gt;. For now, I&amp;rsquo;ll assume that the data already exists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;...;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;memory&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;...;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;call&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that &lt;code&gt;call()&lt;/code&gt; returns a &lt;code&gt;bool&lt;/code&gt; indicating whether the call succeeded. If the call reverts, this return value will be &lt;code&gt;false&lt;/code&gt;. Otherwise, it will be &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s possible to specify how much gas and how much ether are attached to the call:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;call&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gas&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;50000&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;ether&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;using-call-to-execute-arbitrary-function-calls&#34;&gt;Using &lt;code&gt;call()&lt;/code&gt; to Execute Arbitrary Function Calls&lt;/h2&gt;

&lt;p&gt;Our &lt;a href=&#34;https://programtheblockchain.com/posts/2018/07/11/writing-a-trivial-multisig-wallet/&#34;&gt;trivial multisig wallet&lt;/a&gt; uses the &lt;code&gt;transfer()&lt;/code&gt; function to transfer ether to another address. To enable making arbitrary function calls, I&amp;rsquo;m going to use &lt;code&gt;call()&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;I need to add a new parameter for the message data, and this new parameter needs to be part of the signatures from the wallet owners:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;execute&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, I need to use &lt;code&gt;call()&lt;/code&gt; to perform the function call, including transferring the specified amount of ether:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;call&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Remember that if &lt;code&gt;call()&lt;/code&gt; reverts, it returns &lt;code&gt;false&lt;/code&gt;. I&amp;rsquo;m using &lt;code&gt;require()&lt;/code&gt; to bubble that error up and revert the entire transaction if the call fails.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When the interface is known at compile time, Solidity provides nice high-level syntax for making external function calls.&lt;/li&gt;
&lt;li&gt;When the interface is not known at compile time, the low-level &lt;code&gt;call()&lt;/code&gt; function can be used to pass messages to other contracts.&lt;/li&gt;
&lt;li&gt;A multisig wallet can be easily generalized to proxy arbitrary function calls using &lt;code&gt;call()&lt;/code&gt; and encoded message data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;multisig-execute.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7Cgpjb250cmFjdCBNdWx0aXNpZ0V4ZWN1dGUgewogICAgdWludDI1NiBwdWJsaWMgbm9uY2U7ICAgICAvLyAob25seSkgbXV0YWJsZSBzdGF0ZQogICAgYWRkcmVzc1tdIHB1YmxpYyBvd25lcnM7ICAvLyBpbW11dGFibGUgc3RhdGUKCiAgICBjb25zdHJ1Y3RvcihhZGRyZXNzW10gb3duZXJzXykgewogICAgICAgIG93bmVycyA9IG93bmVyc187CiAgICB9CgogICAgZnVuY3Rpb24gZXhlY3V0ZSgKICAgICAgICBhZGRyZXNzIGRlc3RpbmF0aW9uLAogICAgICAgIHVpbnQyNTYgdmFsdWUsCiAgICAgICAgYnl0ZXMgZGF0YSwKICAgICAgICBieXRlczMyW10gc2lnUiwKICAgICAgICBieXRlczMyW10gc2lnUywKICAgICAgICB1aW50OFtdIHNpZ1YKICAgICkKICAgICAgICBleHRlcm5hbAogICAgewogICAgICAgIGJ5dGVzMzIgaGFzaCA9IHByZWZpeGVkKGtlY2NhazI1NihhYmkuZW5jb2RlUGFja2VkKAogICAgICAgICAgICBhZGRyZXNzKHRoaXMpLCBkZXN0aW5hdGlvbiwgdmFsdWUsIGRhdGEsIG5vbmNlCiAgICAgICAgKSkpOwoKICAgICAgICBmb3IgKHVpbnQyNTYgaSA9IDA7IGkgPCBvd25lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgYWRkcmVzcyByZWNvdmVyZWQgPSBlY3JlY292ZXIoaGFzaCwgc2lnVltpXSwgc2lnUltpXSwgc2lnU1tpXSk7CiAgICAgICAgICAgIHJlcXVpcmUocmVjb3ZlcmVkID09IG93bmVyc1tpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB3ZSBtYWtlIGl0IGhlcmUsIGFsbCBzaWduYXR1cmVzIGFyZSBhY2NvdW50ZWQgZm9yLgogICAgICAgIG5vbmNlICs9IDE7CiAgICAgICAgcmVxdWlyZShkZXN0aW5hdGlvbi5jYWxsLnZhbHVlKHZhbHVlKShkYXRhKSk7CiAgICB9CgogICAgZnVuY3Rpb24gKCkgcGF5YWJsZSB7fQoKICAgIC8vIEJ1aWxkcyBhIHByZWZpeGVkIGhhc2ggdG8gbWltaWMgdGhlIGJlaGF2aW9yIG9mIGV0aF9zaWduLgogICAgZnVuY3Rpb24gcHJlZml4ZWQoYnl0ZXMzMiBoYXNoKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKGJ5dGVzMzIpIHsKICAgICAgICByZXR1cm4ga2VjY2FrMjU2KGFiaS5lbmNvZGVQYWNrZWQoCiAgICAgICAgICAgICJceDE5RXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6XG4zMiIsIGhhc2gpKTsKICAgIH0KfQo=&#34; download=&#39;multisig-execute.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MultisigExecute&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// (only) mutable state&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// immutable state&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;execute&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigR&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigS&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigV&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;)));&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recovered&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigV&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigR&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigS&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recovered&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If we make it here, all signatures are accounted for.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;call&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;&lt;code&gt;call()&lt;/code&gt; can actually accept multiple parameters and do minimal ABI encoding at runtime. See &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.24/types.html#members-of-addresses&#34;&gt;the Solidity documentation&lt;/a&gt; for details.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Anatomy of Transaction Data</title>
      <link>https://programtheblockchain.com/posts/2018/07/25/anatomy-of-transaction-data/</link>
      <pubDate>Wed, 25 Jul 2018 12:46:04 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/07/25/anatomy-of-transaction-data/</guid>
      <description>&lt;p&gt;&lt;em&gt;[This blog post explains how transaction data is used to invoke smart contracts in Ethereum, but it is &lt;strong&gt;not&lt;/strong&gt; necessary for learning Solidity programming.  We write it for those of you who would like a deeper understanding of what is going on when a transaction is sent to a smart contract.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In our previous post &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/&#34;&gt;How Ethereum Transactions Work&lt;/a&gt;, we mentioned that the &lt;code&gt;data&lt;/code&gt; field of a transaction encodes what (if any) smart contract function should be invoked. In this post, I&amp;rsquo;ll dive deeper into the specifics of the &lt;code&gt;data&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;smart-contracts-use-message-passing&#34;&gt;Smart Contracts Use Message Passing&lt;/h2&gt;

&lt;p&gt;Ethereum itself has no concept of a &amp;ldquo;function.&amp;rdquo; When a transaction is sent with a smart contract as the &lt;code&gt;to&lt;/code&gt; address, the smart contract&amp;rsquo;s code is executed, and any data included in the transaction is made available to that code.&lt;/p&gt;

&lt;p&gt;This technique is known as &lt;a href=&#34;https://en.wikipedia.org/wiki/Message_passing&#34;&gt;message passing&lt;/a&gt;. In a sense, every smart contract can be thought of as a single function that receives a single argument: a sequence of bytes. In Solidity, you can examine that raw sequence of bytes by accessing &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.24/units-and-global-variables.html#block-and-transaction-properties&#34;&gt;&lt;code&gt;msg.data&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Solidity (and other languages) add the concept of &amp;ldquo;functions&amp;rdquo; on top of low-level message passing. This is essentially implemented as a big &lt;a href=&#34;https://en.wikipedia.org/wiki/Switch_statement&#34;&gt;switch statement&lt;/a&gt; that invokes the right function based on the message data that was sent.&lt;/p&gt;

&lt;h2 id=&#34;function-selectors&#34;&gt;Function Selectors&lt;/h2&gt;

&lt;p&gt;Solidity uses the first four bytes of the message data to indicate which function to call. Specifically, the &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector&#34;&gt;function selector&lt;/a&gt; is the first four bytes of the Keccak-256 hash of the function&amp;rsquo;s signature.&lt;/p&gt;

&lt;p&gt;An example will help. The following is a standard function present in &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;ERC20 token contracts&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The canonical form of the function&amp;rsquo;s signature is the string &lt;code&gt;transfer(address,uint256)&lt;/code&gt;. (Note that parameter names and the return type are ignored when constructing the signature.)&lt;/p&gt;

&lt;p&gt;The Keccak-256 hash of &lt;code&gt;transfer(address,uint256)&lt;/code&gt; is, in hexadecimal, &lt;code&gt;0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The function selector is just the first four bytes of that hash: &lt;code&gt;0xa9059cbb&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;argument-encoding&#34;&gt;Argument Encoding&lt;/h2&gt;

&lt;p&gt;After the four-byte function selector, Solidity treats the rest of the sent data as function arguments. The arguments are encoded according to the Application Binary Interface specification.&lt;/p&gt;

&lt;p&gt;To ABI encode simple, statically-sized types, just pad with zeroes until each value is 32 bytes long:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The address &lt;code&gt;0x123456789a123456789a123456789a123456789a&lt;/code&gt; becomes &lt;code&gt;0x000000000000000000000000123456789a123456789a123456789a123456789a&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The number &lt;code&gt;5&lt;/code&gt; becomes &lt;code&gt;0x0000000000000000000000000000000000000000000000000000000000000005&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the full details of ABI encoding, I recommend &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html&#34;&gt;the Solidity documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;putting-it-all-together&#34;&gt;Putting It All Together&lt;/h2&gt;

&lt;p&gt;The transaction data for the call &lt;code&gt;transfer(0x123456789a123456789a123456789a123456789a, 5)&lt;/code&gt; is the concatenation of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the function selector: &lt;code&gt;0xa9059cbb&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;the padded address: &lt;code&gt;0x000000000000000000000000123456789a123456789a123456789a123456789a&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;and the padded amount: &lt;code&gt;0x0000000000000000000000000000000000000000000000000000000000000005&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full transaction data is then:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0xa9059cbb000000000000000000000000123456789a123456789a123456789a123456789a
0000000000000000000000000000000000000000000000000000000000000005
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;using-web3-js-to-encode-transaction-data&#34;&gt;Using web3.js to Encode Transaction Data&lt;/h2&gt;

&lt;p&gt;Typically, there&amp;rsquo;s no need to manually encode transaction data. For most use cases, the encoding step is a transparent part of sending a transaction. For example, using &lt;a href=&#34;https://github.com/ethereum/web3.js&#34;&gt;web3.js&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;contract.transfer(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x123456789a123456789a123456789a123456789a&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For cases where the encoded transaction data is required, web3.js 0.2x.x provides the &lt;a href=&#34;https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods&#34;&gt;&lt;code&gt;getData()&lt;/code&gt; function&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract.transfer.getData(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x123456789a123456789a123456789a123456789a&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0xa9059cbb000000000000000000000000123456789a123456789a123456789a123456789a0000000000000000000000000000000000000000000000000000000000000005&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(web3.js 1.0 beta has a similar function called &lt;a href=&#34;https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-encodeabi&#34;&gt;&lt;code&gt;encodeABI()&lt;/code&gt;&lt;/a&gt;.)&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum smart contracts work via message passing.&lt;/li&gt;
&lt;li&gt;Function selectors tell Solidity code what function to execute.&lt;/li&gt;
&lt;li&gt;Function arguments are ABI encoded and appended to message data.&lt;/li&gt;
&lt;li&gt;Client libraries typically take care of the details of ABI encoding for you.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>State Channels with Signing Keys</title>
      <link>https://programtheblockchain.com/posts/2018/07/18/state-channels-with-signing-keys/</link>
      <pubDate>Wed, 18 Jul 2018 12:38:49 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/07/18/state-channels-with-signing-keys/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll show how a temporary signing key can be used to improve the user experience of working with state channels.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;State channels involve two parties exchanging off-chain signed messages. Those messages are typically signed with the participants&amp;rsquo; Ethereum private keys. For security reasons, a DApp such as the one presented in &lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/23/working-with-state-channels-in-javascript/&#34;&gt;Working with State Channels in JavaScript&lt;/a&gt; does not usually have have direct access to a user&amp;rsquo;s private key. Instead, it asks a &lt;code&gt;web3&lt;/code&gt; provider such as MetaMask to sign a message, and the user is presented with UI to approve the signature.&lt;/p&gt;

&lt;p&gt;This flow can be cumbersome, requiring extra interactions from the user. This interaction with MetaMask for each signature can be avoided by signing messages directly in JavaScript with a temporary signing key.&lt;/p&gt;

&lt;p&gt;You can try out the &lt;a href=&#34;https://programtheblockchain.com/dapps/twentyone-with-signing-keys/&#34;&gt;new version of the 21  game DApp&lt;/a&gt; to see the result.&lt;/p&gt;

&lt;h2 id=&#34;signing-key&#34;&gt;Signing Key&lt;/h2&gt;

&lt;p&gt;State channels replace on-chain calls to smart contracts with digital signatures exchanged off-chain. The same Ethereum account is usually used for on-chain interactions and for off-chain signatures, but there&amp;rsquo;s no reason this has to be the case. All that matters is that the smart contract recognize the validity of the signature. Each participant can instead designate a different account that they will use to sign messages. The advantage of using a second account is that its private key can be known to JavaScript and thus used directly to sign messages without the help of something like MetaMask.&lt;/p&gt;

&lt;p&gt;To support signing with a different key, I&amp;rsquo;ll need to make a few changes to the smart contract and to the JavaScript front end:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The JavaScript front end needs to generate a new private key and corresponding account to use for signing.&lt;/li&gt;
&lt;li&gt;The smart contract needs to keep track of each participant&amp;rsquo;s signing account.&lt;/li&gt;
&lt;li&gt;When signing messages, the front end needs to use the signing key to directly sign messages rather than invoking MetaMask.&lt;/li&gt;
&lt;li&gt;When verifying a message, the signature must be checked against the expected signing account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The rest of this post will go over the code changes in detail. The result is &lt;a href=&#34;https://programtheblockchain.com/dapps/twentyone-with-signing-keys/&#34;&gt;a new version of the 21 game DApp&lt;/a&gt; which doesn&amp;rsquo;t require the user to interact with MetaMask for each off-chain move.&lt;/p&gt;

&lt;h2 id=&#34;contract-changes&#34;&gt;Contract Changes&lt;/h2&gt;

&lt;p&gt;The smart contract needs to keep track of which accounts are being used for signatures:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Each participant&amp;rsquo;s signing account is passed to the smart contract as a parameter. The first player passes their account to the constructor, and the second player passes it to the &lt;code&gt;join()&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, signatures need to be checked against the appropriate signing accounts in &lt;code&gt;moveFromState()&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Old code:&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// require(recoverSigner(message, sig) == opponentOf(msg.sender));&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;signing-keys-in-javascript&#34;&gt;Signing Keys in JavaScript&lt;/h2&gt;

&lt;p&gt;To support using separate signing accounts, the JavaScript front end needs to track two new pieces of state: &lt;code&gt;signingKey&lt;/code&gt; and &lt;code&gt;opponentSigner&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;signingKey&lt;/code&gt; is a private key generated locally in JavaScript &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.signingKey&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Wallet.generate().getPrivateKeyString();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;From the generated private key, a public address is computed and passed to the smart contract when starting or joining a game:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;start:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;0x&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.privateToAddress(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.signingKey).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;TwentyOneContract.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;600&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer,&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;join:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;0x&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.privateToAddress(that.signingKey).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;contract.join(signer,&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The opponent&amp;rsquo;s signing account is fetched from the smart contract with a call to &lt;code&gt;signerFor&lt;/code&gt;. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;contract.signerFor(player2,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;player2Signer)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;that.opponentSigner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;player2Signer;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;signing-and-verifying-messages-in-javascript&#34;&gt;Signing and Verifying Messages in JavaScript&lt;/h2&gt;

&lt;p&gt;Instead of using &lt;code&gt;web3.personal.sign()&lt;/code&gt; to prompt the user to sign with MetaMask, the new DApp signs directly with the signing key:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;sig&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.ecsign(prefixed(message),&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.toBuffer(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.signingKey));&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;rpcSig&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
   &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.setLengthLeft(sig.r,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
   &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.setLengthLeft(sig.s,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
   &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.toBuffer(sig.v).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When receiving a message, its signature must be checked against the opponent&amp;rsquo;s signing account in &lt;code&gt;updateIfValid()&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Old code:&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// if (signer !== this.opponent.toLowerCase()) return;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.opponentSigner.toLowerCase())&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;security-trade-off&#34;&gt;Security Trade-Off&lt;/h2&gt;

&lt;p&gt;By using a separate signing key, users of the DApp no longer have to approve each signature. This is a significant usability improvement, but it presents a tradeoff between usability and security. In the original version of the DApp, the user was always responsible for the final approval of any signature. Although only a hash of the data was presented to the user, they could theoretically recreate the message and verify that they were signing the move they actually wanted to make.&lt;/p&gt;

&lt;p&gt;When using a separate signing key that is directly handled in JavaScript, the user no longer has the ability to see and approve each message that is being signed. In the example of betting on a game, this means malicious JavaScript code could quietly sign and transmit very bad moves, causing the player to lose the game and therefore their wager.&lt;/p&gt;

&lt;p&gt;I believe that in the case of the original DApp, this tradeoff is clearly worth it. Seeing a binary hash doesn&amp;rsquo;t really allow users to make an informed decision about what to sign, so users already needed to trust the JavaScript code in practice. It&amp;rsquo;s arguably &lt;em&gt;more&lt;/em&gt; secure to allow the app to sign arbitrary messages but only with a one-off account limited in scope to a single game.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Although state channels typically use the same account for on-chain transactions and off-chain signatures, this is not a requirement.&lt;/li&gt;
&lt;li&gt;Using a separate signing key can improve a state channel&amp;rsquo;s user experience.&lt;/li&gt;
&lt;li&gt;This usability improvement comes with a security tradeoff.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;p&gt;The full updated smart contract is below. You can view the source code for the &lt;a href=&#34;https://programtheblockchain.com/dapps/twentyone-with-signing-keys/&#34;&gt;updated DApp&lt;/a&gt; in your browser.&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;twentyone-signing-keys.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7Cgpjb250cmFjdCBUd2VudHlPbmVHYW1lIHsKICAgIGFkZHJlc3MgcHVibGljIHBsYXllcjE7CiAgICBhZGRyZXNzIHB1YmxpYyBwbGF5ZXIyOwogICAgdWludDI1NiBwdWJsaWMgYmV0QW1vdW50OwogICAgYm9vbCBwdWJsaWMgZ2FtZU92ZXI7CgogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IGFkZHJlc3MpIHB1YmxpYyBzaWduZXJGb3I7CgogICAgc3RydWN0IEdhbWVTdGF0ZSB7CiAgICAgICAgdWludDggc2VxOwogICAgICAgIHVpbnQ4IG51bTsKICAgICAgICBhZGRyZXNzIHdob3NlVHVybjsKICAgIH0KICAgIEdhbWVTdGF0ZSBwdWJsaWMgc3RhdGU7CgogICAgdWludDI1NiBwdWJsaWMgdGltZW91dEludGVydmFsOwogICAgdWludDI1NiBwdWJsaWMgdGltZW91dCA9IDIqKjI1NiAtIDE7CgogICAgZXZlbnQgR2FtZVN0YXJ0ZWQoKTsKICAgIGV2ZW50IFRpbWVvdXRTdGFydGVkKCk7CiAgICBldmVudCBNb3ZlTWFkZShhZGRyZXNzIHBsYXllciwgdWludDggc2VxLCB1aW50OCB2YWx1ZSk7CgoKICAgIC8vIFNldHVwIG1ldGhvZHMKCiAgICBjb25zdHJ1Y3Rvcih1aW50MjU2IF90aW1lb3V0SW50ZXJ2YWwsIGFkZHJlc3Mgc2lnbmVyKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcGxheWVyMSA9IG1zZy5zZW5kZXI7CiAgICAgICAgc2lnbmVyRm9yW3BsYXllcjFdID0gc2lnbmVyOwogICAgICAgIGJldEFtb3VudCA9IG1zZy52YWx1ZTsKICAgICAgICB0aW1lb3V0SW50ZXJ2YWwgPSBfdGltZW91dEludGVydmFsOwogICAgfQoKICAgIGZ1bmN0aW9uIGpvaW4oYWRkcmVzcyBzaWduZXIpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICByZXF1aXJlKHBsYXllcjIgPT0gMCwgIkdhbWUgaGFzIGFscmVhZHkgc3RhcnRlZC4iKTsKICAgICAgICByZXF1aXJlKCFnYW1lT3ZlciwgIkdhbWUgd2FzIGNhbmNlbGVkLiIpOwogICAgICAgIHJlcXVpcmUobXNnLnZhbHVlID09IGJldEFtb3VudCwgIldyb25nIGJldCBhbW91bnQuIik7CgogICAgICAgIHBsYXllcjIgPSBtc2cuc2VuZGVyOwogICAgICAgIHNpZ25lckZvcltwbGF5ZXIyXSA9IHNpZ25lcjsKICAgICAgICBzdGF0ZS53aG9zZVR1cm4gPSBwbGF5ZXIxOwoKICAgICAgICBlbWl0IEdhbWVTdGFydGVkKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FuY2VsKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gcGxheWVyMSwgIk9ubHkgZmlyc3QgcGxheWVyIG1heSBjYW5jZWwuIik7CiAgICAgICAgcmVxdWlyZShwbGF5ZXIyID09IDAsICJHYW1lIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuIik7CgogICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICB9CgoKICAgIC8vIFBsYXkgbWV0aG9kcwoKICAgIGZ1bmN0aW9uIG1vdmUodWludDggc2VxLCB1aW50OCB2YWx1ZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKCFnYW1lT3ZlciwgIkdhbWUgaGFzIGVuZGVkLiIpOwogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBzdGF0ZS53aG9zZVR1cm4sICJOb3QgeW91ciB0dXJuLiIpOwogICAgICAgIHJlcXVpcmUodmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzLAogICAgICAgICAgICAiTW92ZSBvdXQgb2YgcmFuZ2UuIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAzLiIpOwogICAgICAgIHJlcXVpcmUoc3RhdGUubnVtICsgdmFsdWUgPD0gMjEsICJNb3ZlIHdvdWxkIGV4Y2VlZCAyMS4iKTsKICAgICAgICByZXF1aXJlKHN0YXRlLnNlcSA9PSBzZXEsICJJbmNvcnJlY3Qgc2VxdWVuY2UgbnVtYmVyLiIpOwoKICAgICAgICBzdGF0ZS5udW0gKz0gdmFsdWU7CiAgICAgICAgc3RhdGUud2hvc2VUdXJuID0gb3Bwb25lbnRPZihtc2cuc2VuZGVyKTsKICAgICAgICBzdGF0ZS5zZXEgKz0gMTsKCiAgICAgICAgLy8gQ2xlYXIgdGltZW91dAogICAgICAgIHRpbWVvdXQgPSAyKioyNTYgLSAxOwoKICAgICAgICBpZiAoc3RhdGUubnVtID09IDIxKSB7CiAgICAgICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgICAgIH0KCiAgICAgICAgZW1pdCBNb3ZlTWFkZShtc2cuc2VuZGVyLCBzZXEsIHZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlRnJvbVN0YXRlKHVpbnQ4IHNlcSwgdWludDggbnVtLCBieXRlcyBzaWcsIHVpbnQ4IHZhbHVlKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoc2VxID49IHN0YXRlLnNlcSwgIlNlcXVlbmNlIG51bWJlciBjYW5ub3QgZ28gYmFja3dhcmRzLiIpOwoKICAgICAgICBieXRlczMyIG1lc3NhZ2UgPSBwcmVmaXhlZChrZWNjYWsyNTYoYWRkcmVzcyh0aGlzKSwgc2VxLCBudW0pKTsKICAgICAgICByZXF1aXJlKHJlY292ZXJTaWduZXIobWVzc2FnZSwgc2lnKSA9PQogICAgICAgICAgICBzaWduZXJGb3Jbb3Bwb25lbnRPZihtc2cuc2VuZGVyKV0pOwoKICAgICAgICBzdGF0ZS5zZXEgPSBzZXE7CiAgICAgICAgc3RhdGUubnVtID0gbnVtOwogICAgICAgIHN0YXRlLndob3NlVHVybiA9IG1zZy5zZW5kZXI7CgogICAgICAgIG1vdmUoc2VxLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gb3Bwb25lbnRPZihhZGRyZXNzIHBsYXllcikgaW50ZXJuYWwgdmlldyByZXR1cm5zIChhZGRyZXNzKSB7CiAgICAgICAgcmVxdWlyZShwbGF5ZXIyICE9IDAsICJHYW1lIGhhcyBub3Qgc3RhcnRlZC4iKTsKCiAgICAgICAgaWYgKHBsYXllciA9PSBwbGF5ZXIxKSB7CiAgICAgICAgICAgIHJldHVybiBwbGF5ZXIyOwogICAgICAgIH0gZWxzZSBpZiAocGxheWVyID09IHBsYXllcjIpIHsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcjE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV2ZXJ0KCJJbnZhbGlkIHBsYXllci4iKTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vIFRpbWVvdXQgbWV0aG9kcwoKICAgIGZ1bmN0aW9uIHN0YXJ0VGltZW91dCgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZSghZ2FtZU92ZXIsICJHYW1lIGhhcyBlbmRlZC4iKTsKICAgICAgICByZXF1aXJlKHN0YXRlLndob3NlVHVybiA9PSBvcHBvbmVudE9mKG1zZy5zZW5kZXIpLAogICAgICAgICAgICAiQ2Fubm90IHN0YXJ0IGEgdGltZW91dCBvbiB5b3Vyc2VsZi4iKTsKCiAgICAgICAgdGltZW91dCA9IG5vdyArIHRpbWVvdXRJbnRlcnZhbDsKICAgICAgICBlbWl0IFRpbWVvdXRTdGFydGVkKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhaW1UaW1lb3V0KCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKCFnYW1lT3ZlciwgIkdhbWUgaGFzIGVuZGVkLiIpOwogICAgICAgIHJlcXVpcmUobm93ID49IHRpbWVvdXQpOwoKICAgICAgICBnYW1lT3ZlciA9IHRydWU7CiAgICAgICAgb3Bwb25lbnRPZihzdGF0ZS53aG9zZVR1cm4pLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICB9CgoKICAgIC8vIFNpZ25hdHVyZSBtZXRob2RzCgogICAgZnVuY3Rpb24gc3BsaXRTaWduYXR1cmUoYnl0ZXMgc2lnKQogICAgICAgIGludGVybmFsCiAgICAgICAgcHVyZQogICAgICAgIHJldHVybnMgKHVpbnQ4LCBieXRlczMyLCBieXRlczMyKQogICAgewogICAgICAgIHJlcXVpcmUoc2lnLmxlbmd0aCA9PSA2NSk7CgogICAgICAgIGJ5dGVzMzIgcjsKICAgICAgICBieXRlczMyIHM7CiAgICAgICAgdWludDggdjsKCiAgICAgICAgYXNzZW1ibHkgewogICAgICAgICAgICAvLyBmaXJzdCAzMiBieXRlcywgYWZ0ZXIgdGhlIGxlbmd0aCBwcmVmaXgKICAgICAgICAgICAgciA6PSBtbG9hZChhZGQoc2lnLCAzMikpCiAgICAgICAgICAgIC8vIHNlY29uZCAzMiBieXRlcwogICAgICAgICAgICBzIDo9IG1sb2FkKGFkZChzaWcsIDY0KSkKICAgICAgICAgICAgLy8gZmluYWwgYnl0ZSAoZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCAzMiBieXRlcykKICAgICAgICAgICAgdiA6PSBieXRlKDAsIG1sb2FkKGFkZChzaWcsIDk2KSkpCiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKHYsIHIsIHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlY292ZXJTaWduZXIoYnl0ZXMzMiBtZXNzYWdlLCBieXRlcyBzaWcpCiAgICAgICAgaW50ZXJuYWwKICAgICAgICBwdXJlCiAgICAgICAgcmV0dXJucyAoYWRkcmVzcykKICAgIHsKICAgICAgICB1aW50OCB2OwogICAgICAgIGJ5dGVzMzIgcjsKICAgICAgICBieXRlczMyIHM7CgogICAgICAgICh2LCByLCBzKSA9IHNwbGl0U2lnbmF0dXJlKHNpZyk7CgogICAgICAgIHJldHVybiBlY3JlY292ZXIobWVzc2FnZSwgdiwgciwgcyk7CiAgICB9CgogICAgLy8gQnVpbGRzIGEgcHJlZml4ZWQgaGFzaCB0byBtaW1pYyB0aGUgYmVoYXZpb3Igb2YgZXRoX3NpZ24uCiAgICBmdW5jdGlvbiBwcmVmaXhlZChieXRlczMyIGhhc2gpIGludGVybmFsIHB1cmUgcmV0dXJucyAoYnl0ZXMzMikgewogICAgICAgIHJldHVybiBrZWNjYWsyNTYoIlx4MTlFdGhlcmV1bSBTaWduZWQgTWVzc2FnZTpcbjMyIiwgaGFzaCk7CiAgICB9Cn0K&#34; download=&#39;twentyone-signing-keys.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TwentyOneGame&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Setup methods&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game was canceled.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Wrong bet amount.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only first player may cancel.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Play methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Not your turn.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move out of range. Must be between 1 and 3.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move would exceed 21.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Incorrect sequence number.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Clear timeout&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;moveFromState&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Sequence number cannot go backwards.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;signerFor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has not started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;revert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Invalid player.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Timeout methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Cannot start a timeout on yourself.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Signature methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;In the full source code, the signing key is also persisted to the browser&amp;rsquo;s local storage. This prevents the key from being lost if the user refreshes the page or closes the browser.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Trivial Multisig Wallet</title>
      <link>https://programtheblockchain.com/posts/2018/07/11/writing-a-trivial-multisig-wallet/</link>
      <pubDate>Wed, 11 Jul 2018 10:15:50 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/07/11/writing-a-trivial-multisig-wallet/</guid>
      <description>&lt;p&gt;This post will demonstrate a very simple
&lt;a href=&#34;https://en.wikipedia.org/wiki/Multisignature&#34;&gt;multisig&lt;/a&gt;
wallet.  This multisig wallet requires unanimous consent for the transfer of funds, and the consent is collected off-chain via signed messages.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Multisig wallets can include lots of complexity including many of the following capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supporting N-of-M voting&lt;/li&gt;
&lt;li&gt;Supporting delegation of votes&lt;/li&gt;
&lt;li&gt;Supporting transferring of votes&lt;/li&gt;
&lt;li&gt;Supporting arbitrary actions&lt;/li&gt;
&lt;li&gt;Supporting multiple outstanding votes via on-chain bookkeeping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post goes to the other extreme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Votes must be unanimous&lt;/li&gt;
&lt;li&gt;No delegation or transferring of votes&lt;/li&gt;
&lt;li&gt;The only action is transferring ether&lt;/li&gt;
&lt;li&gt;Voting is done off-chain with a single on-chain validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post borrows some techniques and inspiration from
&lt;a href=&#34;https://medium.com/@ChrisLundkvist/exploring-simpler-ethereum-multisig-contracts-b71020c19037&#34;&gt;Exploring Simpler Ethereum Multisig Contracts&lt;/a&gt;.
The code here is, however, even simpler.&lt;/p&gt;

&lt;h2 id=&#34;immutable-list-of-owners&#34;&gt;Immutable List of Owners&lt;/h2&gt;

&lt;p&gt;This multisig wallet has multiple owners, who must all agree before funds are transferred from the wallet to a destination account.  The owners are stored in an array:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;UnanimousMultiSig&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// immutable state&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;off-chain-consensus&#34;&gt;Off-Chain Consensus&lt;/h2&gt;

&lt;p&gt;Agreement is done off-chain via signed messages.  The signed messages include four components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;destination&lt;/strong&gt; account that should receive the ether.&lt;/li&gt;
&lt;li&gt;The ether &lt;strong&gt;value&lt;/strong&gt; that should be transferred.&lt;/li&gt;
&lt;li&gt;The message&amp;rsquo;s (R,S,V) &lt;strong&gt;signature&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The sequential &lt;strong&gt;nonce&lt;/strong&gt; of the message.  The nonce prevents a message replay vulnerability.  Each successful transfer increments the nonce by one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To cause a transfer, all of the owners must produce signed messages that agree on the destination, the value, and the nonce.  (The nonce must be the expected nonce.)&lt;/p&gt;

&lt;p&gt;Once messages are collected from all owners, anybody can present them to the wallet to invoke the transfer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// (only) mutable state&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigR&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigS&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigV&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)));&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recovered&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigV&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigR&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigS&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recovered&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If we make it here, all signatures are accounted for.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above includes one subtlety:  the messages must be presented to the wallet in the same order as the owners were originally presented to the contract&amp;rsquo;s constructor.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;prefixed&lt;/code&gt; function is borrowed from &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;Signing and Verifying Messages in Ethereum&lt;/a&gt; and can be found in the full source code below.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Simple multisig wallets can have straightforward implementations.&lt;/li&gt;
&lt;li&gt;Collecting signed messages off-chain helps simplify on-chain work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;unanimous.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7Cgpjb250cmFjdCBVbmFuaW1vdXNNdWx0aVNpZyB7CiAgICB1aW50MjU2IHB1YmxpYyBub25jZTsgICAgIC8vIChvbmx5KSBtdXRhYmxlIHN0YXRlCiAgICBhZGRyZXNzW10gcHVibGljIG93bmVyczsgIC8vIGltbXV0YWJsZSBzdGF0ZQoKICAgIGNvbnN0cnVjdG9yKGFkZHJlc3NbXSBvd25lcnNfKSB7CiAgICAgICAgb3duZXJzID0gb3duZXJzXzsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2ZlcigKICAgICAgICBhZGRyZXNzIGRlc3RpbmF0aW9uLAogICAgICAgIHVpbnQyNTYgdmFsdWUsCiAgICAgICAgYnl0ZXMzMltdIHNpZ1IsCiAgICAgICAgYnl0ZXMzMltdIHNpZ1MsCiAgICAgICAgdWludDhbXSBzaWdWCiAgICApCiAgICAgICAgZXh0ZXJuYWwKICAgIHsKICAgICAgICBieXRlczMyIGhhc2ggPSBwcmVmaXhlZChrZWNjYWsyNTYoYWJpLmVuY29kZVBhY2tlZCgKICAgICAgICAgICAgYWRkcmVzcyh0aGlzKSwgZGVzdGluYXRpb24sIHZhbHVlLCBub25jZQogICAgICAgICkpKTsKCiAgICAgICAgZm9yICh1aW50MjU2IGkgPSAwOyBpIDwgb3duZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGFkZHJlc3MgcmVjb3ZlcmVkID0gZWNyZWNvdmVyKGhhc2gsIHNpZ1ZbaV0sIHNpZ1JbaV0sIHNpZ1NbaV0pOwogICAgICAgICAgICByZXF1aXJlKHJlY292ZXJlZCA9PSBvd25lcnNbaV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgbWFrZSBpdCBoZXJlLCBhbGwgc2lnbmF0dXJlcyBhcmUgYWNjb3VudGVkIGZvci4KICAgICAgICBub25jZSArPSAxOwogICAgICAgIGRlc3RpbmF0aW9uLnRyYW5zZmVyKHZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiAoKSBwYXlhYmxlIHt9CgogICAgLy8gQnVpbGRzIGEgcHJlZml4ZWQgaGFzaCB0byBtaW1pYyB0aGUgYmVoYXZpb3Igb2YgZXRoX3NpZ24uCiAgICBmdW5jdGlvbiBwcmVmaXhlZChieXRlczMyIGhhc2gpIGludGVybmFsIHB1cmUgcmV0dXJucyAoYnl0ZXMzMikgewogICAgICAgIHJldHVybiBrZWNjYWsyNTYoYWJpLmVuY29kZVBhY2tlZCgKICAgICAgICAgICAgIlx4MTlFdGhlcmV1bSBTaWduZWQgTWVzc2FnZTpcbjMyIiwgaGFzaCkpOwogICAgfQp9Cg==&#34; download=&#39;unanimous.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;UnanimousMultiSig&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// (only) mutable state&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// immutable state&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigR&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigS&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigV&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;)));&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recovered&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigV&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigR&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sigS&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recovered&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owners&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If we make it here, all signatures are accounted for.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;destination&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Performing Multiple Actions Transactionally</title>
      <link>https://programtheblockchain.com/posts/2018/07/06/performing-multiple-actions-transactionally/</link>
      <pubDate>Fri, 06 Jul 2018 08:41:23 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/07/06/performing-multiple-actions-transactionally/</guid>
      <description>&lt;p&gt;This post will demonstrate a simple technique for combining multiple actions into a single transaction.  This will enable you to be certain that you get &amp;ldquo;all or nothing&amp;rdquo; execution of the combined actions.  It builds on
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/28/ensuring-the-effects-of-a-transaction/&#34;&gt;Ensuring the Effects of a Transaction&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Suppose that you want to execute two or more actions as a unit such that either all of them or none of them execute.  How would you do that?  The simplest way is to combine all of them into a single transaction.  Like in the previous post, this can be done in the constructor of a contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CombineTransactions&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// parameters needed to execute and check transaction&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// if needed&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// record initial state&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// perform action 1&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// perform action 2&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// perform action N&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// validate final state&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If any of those actions fail, or if the final state isn&amp;rsquo;t correct, then the whole transaction will fail, which will revert the effects of all preceding actions.&lt;/p&gt;

&lt;h2 id=&#34;example-arbitrage&#34;&gt;Example: Arbitrage&lt;/h2&gt;

&lt;p&gt;A classic situation where all-or-nothing execution is desirable is arbitrage.  Arbitrage opportunities present themselves when you can buy something for less than you can sell it for&amp;mdash;typically from different entities.  Without all-or-nothing execution, you would run the risk of buying something and then no longer being able to sell it at an advantageous price.&lt;/p&gt;

&lt;p&gt;For this example, I will reuse the &lt;code&gt;ITokenShop&lt;/code&gt; interface from &lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/28/ensuring-the-effects-of-a-transaction/&#34;&gt;Ensuring the Effects of a Transaction&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Suppose that you found two token shops, with one selling tokens for less than the other is paying for them.  You have found an arbitrage opportunity that you&amp;rsquo;d probably like to exploit by buying tokens and then immediately selling them for a profit.  Doing that in an all-or-nothing fashion makes the transaction risk free (except for gas costs):&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Arbitrage&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// First buy tokens from the shop with the lower price.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;buyShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)();&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Then sell tokens to the shop with the higher price.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Make sure we made a profit.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above follows the pattern of performing multiple actions in a single transaction.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;require&lt;/code&gt; at the end makes sure that the transaction was profitable.  This check is necessary because the &lt;code&gt;buyShop&lt;/code&gt; or &lt;code&gt;sellShop&lt;/code&gt; might have changed prices between when you checked the price and when this transaction is executed.&lt;/p&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;arbitrage.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgIi4uL2NvbW1vbi9pZXJjMjB0b2tlbi5zb2wiOwoKaW50ZXJmYWNlIElUb2tlblNob3AgewogICAgZnVuY3Rpb24gdG9rZW4oKSBleHRlcm5hbCByZXR1cm5zIChJRVJDMjBUb2tlbik7CiAgICBmdW5jdGlvbiBidXkoKSBleHRlcm5hbCBwYXlhYmxlOwogICAgZnVuY3Rpb24gc2VsbCh1aW50MjU2IGFtb3VudCkgZXh0ZXJuYWw7Cn0KCmNvbnRyYWN0IEFyYml0cmFnZSB7CiAgICBjb25zdHJ1Y3RvciAoCiAgICAgICAgSVRva2VuU2hvcCBidXlTaG9wLAogICAgICAgIElUb2tlblNob3Agc2VsbFNob3AsCiAgICAgICAgdWludDI1NiBhbW91bnQKICAgICkKICAgICAgICBwdWJsaWMKICAgICAgICBwYXlhYmxlCiAgICB7CiAgICAgICAgLy8gRmlyc3QgYnV5IHRva2VucyBmcm9tIHRoZSBzaG9wIHdpdGggdGhlIGxvd2VyIHByaWNlLgogICAgICAgIGJ1eVNob3AuYnV5LnZhbHVlKG1zZy52YWx1ZSkoKTsKCiAgICAgICAgLy8gVGhlbiBzZWxsIHRva2VucyB0byB0aGUgc2hvcCB3aXRoIHRoZSBoaWdoZXIgcHJpY2UuCiAgICAgICAgc2VsbFNob3AudG9rZW4oKS5hcHByb3ZlKHNlbGxTaG9wLCBhbW91bnQpOwogICAgICAgIHNlbGxTaG9wLnNlbGwoYW1vdW50KTsKCiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIG1hZGUgYSBwcm9maXQuCiAgICAgICAgcmVxdWlyZShhZGRyZXNzKHRoaXMpLmJhbGFuY2UgPiBtc2cudmFsdWUpOwoKICAgICAgICBzZWxmZGVzdHJ1Y3QobXNnLnNlbmRlcik7CiAgICB9Cn0K&#34; download=&#39;arbitrage.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;../common/ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Arbitrage&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// First buy tokens from the shop with the lower price.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;buyShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)();&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Then sell tokens to the shop with the higher price.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Make sure we made a profit.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Ensuring the Effects of a Transaction</title>
      <link>https://programtheblockchain.com/posts/2018/06/28/ensuring-the-effects-of-a-transaction/</link>
      <pubDate>Thu, 28 Jun 2018 11:35:44 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/28/ensuring-the-effects-of-a-transaction/</guid>
      <description>&lt;p&gt;This post will demonstrate a simple technique for ensuring that a transaction had the desired effects.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;the-challenge&#34;&gt;The Challenge&lt;/h2&gt;

&lt;p&gt;Suppose that you learn of a contract that &lt;em&gt;purports&lt;/em&gt; to do something desirable, but you&amp;rsquo;re just not sure that it actually does what it is supposed to.  What can you do to protect yourself?&lt;/p&gt;

&lt;p&gt;Obviously, you can (and should) examine the contract&amp;rsquo;s code.  You might find trusted auditors who can vouch for the code&amp;rsquo;s effect.  But you may still be left with some concerns because the contract&amp;rsquo;s promises seem just too good to be true.  Fortunately, it&amp;rsquo;s pretty easy to validate that a transaction had the desired effect before committing to it.&lt;/p&gt;

&lt;p&gt;The technique is simple: create a special-purpose contract that performs the desired action and then revert if the desired effects did not take place.&lt;/p&gt;

&lt;h2 id=&#34;an-example&#34;&gt;An Example&lt;/h2&gt;

&lt;p&gt;Suppose that you want to buy a quantity of an ERC20 token. You find a contract that sell those tokens at a good price. You want to buy the tokens and be certain that the contract actually sells them at the correct price.  This example will show you how to do that.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m going to assume this interface for the token seller:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To execute a checked token purchase, the validating contract needs to know the address of the token seller, the token type, and the expected amount of tokens to be purchased.  The ether to purchase the tokens will be attached to the deployment transaction.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Validator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expectedAmount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// record the sender&amp;#39;s beginning token balance&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;before&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// this contract buys the tokens&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)();&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer the tokens to the sender&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expectedAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// check that the sender&amp;#39;s final balance has increased&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// by expectedAmount&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;before&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;expectedAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that this is a single-use contract. It has no functions other than the constructor, so everything happens at the time of deployment.&lt;/p&gt;

&lt;p&gt;The constructor executes the purchase and checks that the number of tokens the sender owns increases appropriately.  If not, the &lt;code&gt;require&lt;/code&gt; fails and the transaction reverts.  If it reverts, the sender only loses the gas needed to execute this transaction.&lt;/p&gt;

&lt;p&gt;There is one subtlety above regarding the purchase of the tokens.  This contract buys the tokens for &lt;em&gt;itself&lt;/em&gt; using the &lt;code&gt;buy&lt;/code&gt; function of the token seller.  Because the purpose of the contract is to buy tokens for the sender, this contract must also transfer those tokens to the sender.&lt;/p&gt;

&lt;p&gt;The contract self-destructs to save gas.&lt;/p&gt;

&lt;h2 id=&#34;simple-pattern&#34;&gt;Simple Pattern&lt;/h2&gt;

&lt;p&gt;The contract above is a specific example of a very simple pattern that can be used for situations where you want to be certain of the effects of a given contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Validator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// parameters needed to execute and check transaction&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// if needed&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// record initial state&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// perform action&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// validate final state&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A couple notes about this pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The initial and final states are &lt;em&gt;not&lt;/em&gt; typically the final states of this contract.  More commonly, they are the initial and final states of the sender.&lt;/li&gt;
&lt;li&gt;This transaction may include code after the desired action to transfer assets from the contract to the sender.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;validator.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgIi4uL2NvbW1vbi9pZXJjMjB0b2tlbi5zb2wiOwoKaW50ZXJmYWNlIElUb2tlblNob3AgewogICAgZnVuY3Rpb24gdG9rZW4oKSBleHRlcm5hbCByZXR1cm5zIChJRVJDMjBUb2tlbik7CiAgICBmdW5jdGlvbiBidXkoKSBleHRlcm5hbCBwYXlhYmxlOwogICAgZnVuY3Rpb24gc2VsbCh1aW50MjU2IGFtb3VudCkgZXh0ZXJuYWw7Cn0KCmNvbnRyYWN0IFZhbGlkYXRvciB7CgogICAgY29uc3RydWN0b3IgKAogICAgICAgIElUb2tlblNob3AgdHMsCiAgICAgICAgSUVSQzIwVG9rZW4gdG9rZW4sCiAgICAgICAgdWludDI1NiBleHBlY3RlZEFtb3VudAogICAgKQogICAgICAgIHB1YmxpYwogICAgICAgIHBheWFibGUKICAgIHsKICAgICAgICAvLyByZWNvcmQgdGhlIHNlbmRlcidzIGJlZ2lubmluZyB0b2tlbiBiYWxhbmNlCiAgICAgICAgdWludDI1NiBiZWZvcmUgPSB0b2tlbi5iYWxhbmNlT2YobXNnLnNlbmRlcik7CgogICAgICAgIC8vIHRoaXMgY29udHJhY3QgYnV5cyB0aGUgdG9rZW5zCiAgICAgICAgdHMuYnV5LnZhbHVlKG1zZy52YWx1ZSkoKTsKCiAgICAgICAgLy8gdHJhbnNmZXIgdGhlIHRva2VucyB0byB0aGUgc2VuZGVyCiAgICAgICAgdG9rZW4udHJhbnNmZXIobXNnLnNlbmRlciwgZXhwZWN0ZWRBbW91bnQpOwoKICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBzZW5kZXIncyBmaW5hbCBiYWxhbmNlIGhhcyBpbmNyZWFzZWQKICAgICAgICAvLyBieSBleHBlY3RlZEFtb3VudAogICAgICAgIHJlcXVpcmUodG9rZW4uYmFsYW5jZU9mKG1zZy5zZW5kZXIpID09IGJlZm9yZStleHBlY3RlZEFtb3VudCk7CgogICAgICAgIHNlbGZkZXN0cnVjdChtc2cuc2VuZGVyKTsKICAgIH0KfQo=&#34; download=&#39;validator.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;../common/ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Validator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ITokenShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expectedAmount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// record the sender&amp;#39;s beginning token balance&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;before&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// this contract buys the tokens&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)();&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer the tokens to the sender&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expectedAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// check that the sender&amp;#39;s final balance has increased&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// by expectedAmount&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;before&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;expectedAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Working with State Channels in JavaScript</title>
      <link>https://programtheblockchain.com/posts/2018/06/23/working-with-state-channels-in-javascript/</link>
      <pubDate>Sat, 23 Jun 2018 08:26:13 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/23/working-with-state-channels-in-javascript/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll show how to build a JavaScript front end for a two-player game based on state channels.&lt;/p&gt;

&lt;p&gt;This post is a continuation of my previous posts &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/04/two-player-games-in-ethereum/&#34;&gt;Two-Player Games in Ethereum&lt;/a&gt;&amp;rdquo; and &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/11/state-channels-for-two-player-games/&#34;&gt;State Channels for Two-Player Games&lt;/a&gt;.&amp;rdquo; This post assumes that you&amp;rsquo;ve read and understood those.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;

&lt;p&gt;In a typical DApp, the role of the front end is to provide a friendly user interface for a smart contract. Data displayed comes directly from the smart contract&amp;rsquo;s state, and interactive UI elements result in function calls to the smart contract.&lt;/p&gt;

&lt;p&gt;For a DApp based on state channels, the front end is more involved. In addition to interacting with the smart contract, it must handle off-chain interactions with another user. The state displayed is an aggregate of off-chain and on-chain information, and most interactions are peer-to-peer with an untrusted adversary.&lt;/p&gt;

&lt;p&gt;The JavaScript front end in this post will do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploy&lt;/strong&gt; a new game contract or &lt;strong&gt;join&lt;/strong&gt; an existing game as a second player.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communicate&lt;/strong&gt; moves to the other player via signed messages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track&lt;/strong&gt; the current game state, including off-chain progress as well as the smart contract&amp;rsquo;s state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send transactions&lt;/strong&gt; to the smart contract when necessary: either to end the game or to deal with timeouts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;technology-used&#34;&gt;Technology Used&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;https://programtheblockchain.com/dapps/twentyone/&#34;&gt;21 game DApp&lt;/a&gt; uses &lt;code&gt;web3.js&lt;/code&gt; version &lt;code&gt;0.2x.x&lt;/code&gt;. At the time of this writing, &lt;code&gt;1.0&lt;/code&gt; is still in beta and not very compatible with MetaMask.&lt;/p&gt;

&lt;p&gt;The DApp uses &lt;a href=&#34;https://vuejs.org/&#34;&gt;Vue.js&lt;/a&gt; to handle displaying data and responding to HTML events. I&amp;rsquo;m going to omit most of that plumbing in this post and focus on the Ethereum-specific concepts. In the code below, the &lt;code&gt;this&lt;/code&gt; variable points to a &lt;code&gt;Vue&lt;/code&gt; instance, and updates to its members result in updates to the HTML.&lt;/p&gt;

&lt;p&gt;For exchanging messages between opponents, the DApp uses &lt;a href=&#34;https://www.pubnub.com/&#34;&gt;PubNub&lt;/a&gt;, a simple realtime communication platform. In particular, I&amp;rsquo;m using pub/sub over Websockets to exchange messages in the game. Again, I&amp;rsquo;m going to omit some details about PubNub in the code in this post.&lt;/p&gt;

&lt;p&gt;If you want to see the details I&amp;rsquo;m omitting, the full source code for &lt;a href=&#34;https://programtheblockchain.com/dapps/twentyone/&#34;&gt;the DApp&lt;/a&gt; can be seen by using the &amp;ldquo;view source&amp;rdquo; feature in your browser.&lt;/p&gt;

&lt;h2 id=&#34;starting-a-new-game&#34;&gt;Starting a New Game&lt;/h2&gt;

&lt;p&gt;The first player starts a new game by pressing the &amp;ldquo;Deploy contract&amp;rdquo; button. This has the effect of deploying the contract and setting up some event handlers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;bytecode&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;abi&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[...];&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;TwentyOneContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.contract(abi);&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;start:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Deploy the contract, using a 10-minute timeout interval and a 0.01&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ether wager.&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;TwentyOneContract.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;600&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;data:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;bytecode,&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;gas:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2000000&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;value:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.toWei(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0.01&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ether&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;that.contract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Once the contract has been deployed...&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(contract.address)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Subscribe to messages and events.&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.subscribe();&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Deployment succeeded. Contract address: &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract.address);&lt;/span&gt;

      &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Listen for when the game is started.&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.contract.GameStarted(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.contract.player2(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;opponent)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Update our local state to reflect our opponent&amp;#39;s address and&lt;/span&gt;
          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the fact that it&amp;#39;s our turn.&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;that.opponent&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;opponent;&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;that.whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that.account;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Deploying contract. Transaction hash: &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract.transactionHash);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;subscribe:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.allEvents(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;event)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;that.fetchContractState();&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;pubnub.subscribe({&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;channels:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;21-&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.address],&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here are a few notes about the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new contract is deployed for each game.&lt;/li&gt;
&lt;li&gt;The bytecode and ABI come from the Solidity compiler. (I used &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/19/testing-and-deploying-smart-contracts-with-remix/&#34;&gt;Remix&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;The code listens for a &lt;code&gt;GameStarted&lt;/code&gt; event, which happens when a second player joins the game.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;subscribe()&lt;/code&gt; function starts listening to a PubNub channel named after the contract&amp;rsquo;s address. PubNub channels do not require explicit creation. This function also listens for any changes from the contract and calls &lt;code&gt;fetchContractState()&lt;/code&gt;, which will be described later in this post.&lt;/li&gt;
&lt;li&gt;The callback for &lt;code&gt;TwentyOneContract.new&lt;/code&gt; is called twice: first when the transaction is sent, and second when the transaction has been mined. The &lt;code&gt;if (contract.address)&lt;/code&gt; conditional makes use of the contract only after it&amp;rsquo;s been deployed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the contract is deployed, its address is displayed to the user. They need to share this address with another user so that user can join the game. This can be done by email, text message, etc.&lt;/p&gt;

&lt;h2 id=&#34;joining-an-existing-game&#34;&gt;Joining an Existing Game&lt;/h2&gt;

&lt;p&gt;A player can join an existing game if they know the game contract&amp;rsquo;s address. The following code invokes the smart contract&amp;rsquo;s &lt;code&gt;join()&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;join:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.$refs.address.value;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;TwentyOneContract.at(address);&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;contract.join({&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;value:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.toWei(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0.01&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ether&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt.status&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x01&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game joined.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.contract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contract;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.opponent&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;player1;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;player1;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.subscribe();&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the code in the DApp is a bit more sophisticated than this. It also handles the case of &lt;em&gt;resuming&lt;/em&gt; a game when the player is already participating. It checks the state of the contract to detect this case and then updates the local state to match the latest contract state.&lt;/p&gt;

&lt;h2 id=&#34;tracking-smart-contract-state&#34;&gt;Tracking Smart Contract State&lt;/h2&gt;

&lt;p&gt;For a state-channel based DApp, state changes can come from two places: the smart contract or messages received off-chain. The front end needs to handle both.&lt;/p&gt;

&lt;p&gt;The local state includes the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account&lt;/code&gt; is the player&amp;rsquo;s address.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;opponent&lt;/code&gt; is the opponent&amp;rsquo;s address.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;contract&lt;/code&gt; is the deployed game contract.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seq&lt;/code&gt; is the last valid sequence number known to this client.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num&lt;/code&gt; is the game&amp;rsquo;s &amp;ldquo;number&amp;rdquo; associated with &lt;code&gt;seq&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whoseTurn&lt;/code&gt; indicates whose turn is next.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pendingMove&lt;/code&gt; is the unacknowledged last move by &lt;code&gt;account&lt;/code&gt;. It is &lt;code&gt;null&lt;/code&gt; if no move is pending.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;signature&lt;/code&gt; is the signature from the opponent&amp;rsquo;s last message.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeout&lt;/code&gt; is when the current timeout, if any, expires. If there is no current timeout, this has the value of &lt;code&gt;maxuint&lt;/code&gt; (2&lt;sup&gt;256&lt;/sup&gt; - 1).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;latePlayer&lt;/code&gt; indicates which account must respond to the timeout.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gameOver&lt;/code&gt; indicates whether the game is over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;fetchContractState()&lt;/code&gt; function reads the current state from the smart contract and updates the local state accordingly. Note that because state changes come from two places, there can be conflicts. These conflicts are resolved by using the game&amp;rsquo;s sequence number. A state change can be ignored if it has a lower sequence number than the local state:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;fetchContractState:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Fetch the state from the contract.&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.state(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;state)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;state[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].toNumber();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;state[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].toNumber();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;state[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Only update if the sequence number has increased.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that.seq)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;seq;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;num;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;whoseTurn;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.pendingMove&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.signature&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Fetch the timeout status from the contract.&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;that.contract.timeout(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;timeout)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(timeout.equals(maxuint))&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// A value of 2^256-1 indicates no timeout.&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.latePlayer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;timeout.toNumber();&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.latePlayer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;whoseTurn;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Check whether the game is over.&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;that.contract.gameOver(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;gameOver)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;that.gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;gameOver;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;tracking-off-chain-state&#34;&gt;Tracking Off-Chain State&lt;/h2&gt;

&lt;p&gt;When a player makes a move, it is sent via a PubNub message. The message includes the move that was made as well as a signature of the resulting state. If a received move and its signature are valid, the local state must be updated to reflect the move:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;updateIfValid:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(move,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.opponent)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(move&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;move&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.num;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.seq;&lt;/span&gt;

  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// First apply our pending move.&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.pendingMove)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.pendingMove;&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;move;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;prefixed(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.stateHash(seq,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;num));&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;recoverSigner(message,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature);&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.opponent.toLowerCase())&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;seq;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;num;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.account;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.pendingMove&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.signature&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;prefixed()&lt;/code&gt; and &lt;code&gt;recoverSigner()&lt;/code&gt; are borrowed from our post &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;Writing a Simple Payment Channel&lt;/a&gt;.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;stateHash()&lt;/code&gt; computes the hash for a given game state:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;stateHash:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(seq,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;number)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.ABI.soliditySHA3(&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;address&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint8&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint8&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.address,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;seq,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;number],&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A move is only valid if it&amp;rsquo;s that player&amp;rsquo;s turn, the move is between 1 and 3, the resulting number does not exceed 21, and the signature is valid.&lt;/li&gt;
&lt;li&gt;Invalid moves are silently ignored.&lt;/li&gt;
&lt;li&gt;All moves are based on the latest state, including any &lt;em&gt;pending move&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea of a &amp;ldquo;pending move&amp;rdquo; requires some explanation. It&amp;rsquo;s most easily understood in the context of an in-progress game:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The off-chain game state is: &lt;code&gt;{ seq: 3, num: 7, signature: ... }&lt;/code&gt;. (The signature is from my opponent and matches that state.)&lt;/li&gt;
&lt;li&gt;I send my opponent a message with the move 3.&lt;/li&gt;
&lt;li&gt;Due to a networking error, my opponent never sees that message and eventually starts a timeout via the smart contract.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To avoid forfeiting the game, I must respond to the timeout by calling &lt;code&gt;moveFromState()&lt;/code&gt; on the smart contract. That function requires three things: the state I&amp;rsquo;m moving from, a signature from my opponent matching that state, and the move I would like to make.&lt;/p&gt;

&lt;p&gt;If after step 2, I updated my local state to &lt;code&gt;{ seq: 4, num: 10 }&lt;/code&gt;, then I no longer have the information I need to call &lt;code&gt;moveFromState()&lt;/code&gt;. Instead, I use the concept of a &lt;em&gt;pending move&lt;/em&gt; and update the state to &lt;code&gt;{ seq: 3, num: 7, signature: ..., pendingMove: 3 }&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With that information, I can successfully call &lt;code&gt;moveFromState()&lt;/code&gt; and resume the game.&lt;/p&gt;

&lt;p&gt;If my opponent &lt;em&gt;had&lt;/em&gt; seen my move and made their own move in response, I would just need to apply the pending move before processing theirs. This is exactly what &lt;code&gt;updateIfValid()&lt;/code&gt; does.&lt;/p&gt;

&lt;h2 id=&#34;making-moves&#34;&gt;Making Moves&lt;/h2&gt;

&lt;p&gt;A move can be made either on-chain, by sending a transaction, or off-chain, by sending a signed message to the opponent. By default, messages are sent off-chain to avoid transaction delays and expense. A message is sent on-chain in only two cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s the winning move. Sending a transaction is necessary here to claim the ether prize.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a timeout running against this player. Calling &lt;code&gt;move()&lt;/code&gt; on the smart contract clears the timeout and avoids forfeiting the game.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The JavaScript &lt;code&gt;move()&lt;/code&gt; function checks for those cases and either sends an on-chain transaction or transmits a signed message via PubNub:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;move:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(n)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.stateHash(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;n);&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.latePlayer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.account)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Send move to the contract if it&amp;#39;s the winning move or there&amp;#39;s a&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// timer running against us.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contractMove(n);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Otherwise send a signed message to our opponent.&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;web3.personal.sign(&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;message,&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount,&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;pubnub.publish({&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;channel:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;21-&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that.contract.address,&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;message:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;move:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;n,&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;signature:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature,&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;that.whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that.opponent;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.pendingMove&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;n;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that off-chain messages require updating &lt;code&gt;pendingMove&lt;/code&gt;, as described in the previous section.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;contractMove()&lt;/code&gt; function handles sending a move to the smart contract with a transaction. The contract supports two different functions for submitting a move:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;move()&lt;/code&gt; makes a move based on the current state known to the contract.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;moveFromState()&lt;/code&gt; updates the contract with the latest signed state from the opponent and then makes a move on top of that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following code uses the appropriate contract method by checking whether the local state contains a signature or not. If there&amp;rsquo;s a signature, &lt;code&gt;moveFromState()&lt;/code&gt; is called. If there is no signature, it means the most recent local state from the smart contract, so &lt;code&gt;move()&lt;/code&gt; can be called directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;contractMove:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(n,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;cb)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt.status&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x01&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move made.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(cb)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;cb();&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.fetchContractState();&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;error(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Failed to submit move.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.signature)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.moveFromState(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.seq,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.num,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.signature,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;n,&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;callback);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.move(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.seq,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;n,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;dealing-with-timeouts&#34;&gt;Dealing with Timeouts&lt;/h2&gt;

&lt;p&gt;If a player stops making moves when it&amp;rsquo;s their turn, this is considered a forfeit. A timer is used to enforce this rule.&lt;/p&gt;

&lt;p&gt;Three operations deal with timeouts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A player can &lt;em&gt;start&lt;/em&gt; a timeout when it&amp;rsquo;s their opponent&amp;rsquo;s turn.&lt;/li&gt;
&lt;li&gt;A player can &lt;em&gt;claim&lt;/em&gt; a timeout once it&amp;rsquo;s expired.&lt;/li&gt;
&lt;li&gt;A player can &lt;em&gt;stop&lt;/em&gt; a timeout by making a move.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To start a timeout, the player must first ensure that the contract knows it&amp;rsquo;s their opponent&amp;rsquo;s turn. To do that, they need to send their pending move (if any) to the smart contract before invoking &lt;code&gt;startTimeout()&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;moveAndStartTimeout:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;startTimeout()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;that.contract.startTimeout(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt.status&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x01&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Timeout started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Transaction failed.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;that.fetchContractState();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.pendingMove)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Making latest move on-chain...&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contractMove(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.pendingMove,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;startTimeout);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;startTimeout();&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once the timeout has expired, the winning player can call &lt;code&gt;claimTimeout()&lt;/code&gt; to collect their winnings:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;claimTimeout:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.claimTimeout(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt.status&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x01&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Timeout claimed.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Transaction failed.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;that.fetchContractState();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No special code is required to &lt;em&gt;stop&lt;/em&gt; a timeout, because this is already dealt with in the &lt;code&gt;move()&lt;/code&gt; function from the previous section.&lt;/p&gt;

&lt;h2 id=&#34;canceling-a-game&#34;&gt;Canceling a Game&lt;/h2&gt;

&lt;p&gt;While waiting for an opponent to join, the player who started the game is allowed to cancel it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;cancelGame:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;that&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.contract.cancel(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt.status&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x01&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game canceled.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;that.fetchContractState();&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;p&gt;You can use &amp;ldquo;view source&amp;rdquo; in your browser to see the full code for the &lt;a href=&#34;https://programtheblockchain.com/dapps/twentyone/&#34;&gt;21 game DApp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To play the game by yourself, I recommend using two different browsers (e.g. Chrome and Firefox), rather than just two windows or tabs. This is because MetaMask&amp;rsquo;s account selection is per browser, so you&amp;rsquo;ll find yourself having to switch back and forth between accounts with each move. Using two different browsers means you can easily use a separate account with each.&lt;/p&gt;

&lt;h2 id=&#34;future-work&#34;&gt;Future Work&lt;/h2&gt;

&lt;p&gt;This code works, but there are a couple areas for improvement:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Retry logic&lt;/strong&gt;: Right now, if a networking issue interrupts communication, the players have no choice but to make at least one on-chain transaction to resume the game. A simple fix would be to resend messages periodically until they&amp;rsquo;re acknowledged by the opponent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signature confirmation&lt;/strong&gt;: Every move requires additional user interaction to sign a message. In the case of MetaMask, this is a popup that the user must click on. If the user is willing to trust the DApp code to a limited extent, it&amp;rsquo;s possible to avoid this by signing with a temporary generated account instead. I will explore this idea in a future post.&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    
    <item>
      <title>Supporting an Off-Chain Market Maker</title>
      <link>https://programtheblockchain.com/posts/2018/06/16/supporting-an-off-chain-market-maker/</link>
      <pubDate>Sat, 16 Jun 2018 06:33:49 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/16/supporting-an-off-chain-market-maker/</guid>
      <description>&lt;p&gt;This post will implement a token-trading &amp;ldquo;market maker&amp;rdquo; that will fulfill multiple signed prediction market wagers simultaneously.  It will be a modest change to the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/06/supporting-off-chain-token-trading/&#34;&gt;clearinghouse contract&lt;/a&gt;
presented earlier, and it will exploit the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/12/betting-tokens-in-a-prediction-market/&#34;&gt;token-based prediction market contract&lt;/a&gt;
unchanged.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Market makers (often known as &amp;ldquo;bookmakers&amp;rdquo;) strive to take many bets that will offset each other while collecting a percentage of the bets as their compensation.  Typically, bookmakers take bets sequentially, ever mindful of whether the bets are offsetting each other.  If the bets begin to represent a risk due to imbalance, the bookmaker may need to adjust their actions.  For instance, they can change the odds to try to bring the booked bets into balance.&lt;/p&gt;

&lt;p&gt;A bookmaker acts as a market maker by participating in bets themselves, typically in anticipation of future bets that will offset the current bets.  By taking many bets concurrently, there is more opportunity to keep the books in balance (by rejecting bets if they clearly would skew the betting).&lt;/p&gt;

&lt;p&gt;This contract will support an off-chain market maker for prediction markets.  Exactly like the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/06/supporting-off-chain-token-trading/&#34;&gt;clearinghouse contract&lt;/a&gt;,
trade offers (bets) will be proposed off-chain with signed messages.&lt;/p&gt;

&lt;h2 id=&#34;why-not-just-use-the-clearinghouse-contract&#34;&gt;Why Not Just Use the Clearinghouse Contract?&lt;/h2&gt;

&lt;p&gt;Given that the token-based prediction markets simply exchange tokens, and the clearinghouse contract handles off-chain token trading, why would a prediction market bookmaker need anything more?  It&amp;rsquo;s because prediction market tokens can be bought and sold in bundles for a fixed price.  A market maker can exploit this special property to accept bets that would otherwise have been impossible.  An example will help.&lt;/p&gt;

&lt;p&gt;Assume the following two independent prediction markets exist, with each winning token worth 1 (wrapped) ETH:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The NFC Championship, with two securities/tokens: COWBOYS and PACKERS.&lt;/li&gt;
&lt;li&gt;The AFC Championship, with two securities: PATRIOTS and STEELERS.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Further, assume that the following two trades are proposed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Alice would like to trade 1,000 COWBOYS tokens for 1,000 PATRIOTS tokens.&lt;/li&gt;
&lt;li&gt;Bob would like to trade 1,000 PACKERS tokens for 1,000 STEELERS tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A market maker contract can exploit the ability to buy and refund complete bundles of tokens to satisfy these exchanges by doing the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The market maker takes possession of the 1,000 COWBOYS and PACKERS tokens from Alice and Bob.&lt;/li&gt;
&lt;li&gt;The market maker uses &lt;code&gt;refundBundle&lt;/code&gt; on the NFC prediction market to exchange those for 1,000 wrapped ETH tokens.&lt;/li&gt;
&lt;li&gt;The market maker uses &lt;code&gt;buyBundle&lt;/code&gt; on the AFC prediction market to buy 1,000 AFC bundles (both PATRIOTS and STEELERS tokens) for those 1,000 wrapped ETH tokens.&lt;/li&gt;
&lt;li&gt;The market maker distributes the 1,000 PATRIOTS tokens to Alice, and the 1,000 STEELERS tokens to Bob.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without the contract&amp;rsquo;s ability to buy and refund bundles, it would have been impossible for the market maker to have orchestrated those trades directly.&lt;/p&gt;

&lt;h2 id=&#34;executing-trades&#34;&gt;Executing Trades&lt;/h2&gt;

&lt;p&gt;In the clearinghouse contract, multiple trades are executed in three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All trades are validated.&lt;/li&gt;
&lt;li&gt;Traded tokens are gathered.&lt;/li&gt;
&lt;li&gt;Tokens are distributed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The market maker contract for prediction markets will augment that with bundle buying and bundle refunding steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All trades are validated.&lt;/li&gt;
&lt;li&gt;Traded tokens are gathered.&lt;/li&gt;
&lt;li&gt;Bundles are refunded and bought.&lt;/li&gt;
&lt;li&gt;Tokens are distributed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The code for &lt;code&gt;executeWagers&lt;/code&gt; below is the same as the clearinghouse&amp;rsquo;s &lt;code&gt;executeOffers&lt;/code&gt; with the additional bundle buying/refunding step (and the corresponding parameters):&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;executeWagers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;int256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bundleAmounts&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;acceptOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;gatherOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;buyOrRefundBundles&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bundleAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;distributeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The parameters for buying/refunding tokens use signed integers to represent amounts.  Positive values represent buying bundles, and negative values represent refunds.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyOrRefundBundles&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;int256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]));&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(-&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]));&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;buying-bundles&#34;&gt;Buying Bundles&lt;/h2&gt;

&lt;p&gt;Buying bundles is straightforward.  The contract approves transfer of payment tokens to the prediction market, it buys the bundle with those tokens, and then it puts all the bought tokens into the contract owner&amp;rsquo;s escrow accounts:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// approve transfer of payment tokens&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// buy the bundle&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer bundle from this to owner and adjust escrow&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcomeCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;refunding-bundles&#34;&gt;Refunding Bundles&lt;/h2&gt;

&lt;p&gt;Similar logic holds for the refunding of bundles:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// approve transfer of bundle and adjust escrow&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcomeCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// refund the bundle&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// account for the received tokens in owner&amp;#39;s escrow account&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An off-chain market maker for prediction markets can be supported with a smart contract.&lt;/li&gt;
&lt;li&gt;The smart contract is a simple adaptation of the clearinghouse contract.&lt;/li&gt;
&lt;li&gt;The market maker can exploit the buying and refunding of bundles to accept more bets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;bookmaker.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgImNsZWFyaW5naG91c2Uuc29sIjsKaW1wb3J0ICJ3YWdlcnRva2VucHJlZGljdGlvbm1hcmtldC5zb2wiOwoKY29udHJhY3QgQm9va21ha2VyIGlzIENsZWFyaW5naG91c2UgewoKICAgIGNvbnN0cnVjdG9yICh1aW50MjU2IF9lc2Nyb3dUaW1lKQogICAgICAgIENsZWFyaW5naG91c2UoX2VzY3Jvd1RpbWUpCiAgICAgICAgcHVibGljCiAgICB7CiAgICB9CgogICAgZnVuY3Rpb24gYnV5QnVuZGxlKAogICAgICAgIFRva2VuUHJlZGljdGlvbk1hcmtldCBwbSwKICAgICAgICB1aW50MjU2IGFtb3VudAogICAgKQogICAgICAgIGludGVybmFsCiAgICB7CiAgICAgICAgLy8gYXBwcm92ZSB0cmFuc2ZlciBvZiBwYXltZW50IHRva2VucwogICAgICAgIElFUkMyMFRva2VuIHd0ID0gcG0ud2FnZXJ0b2tlbigpOwogICAgICAgIHd0LmFwcHJvdmUocG0sIGFtb3VudCk7CiAgICAgICAgZXNjcm93QmFsYW5jZVtvd25lcl1bd3RdIC09IGFtb3VudDsKCiAgICAgICAgLy8gYnV5IHRoZSBidW5kbGUKICAgICAgICBwbS5idXlCdW5kbGUoYW1vdW50KTsKCiAgICAgICAgLy8gdHJhbnNmZXIgYnVuZGxlIGZyb20gdGhpcyB0byBvd25lciBhbmQgYWRqdXN0IGVzY3JvdwogICAgICAgIHVpbnQyNTYgbGVuZ3RoID0gcG0ub3V0Y29tZUNvdW50KCk7CiAgICAgICAgZm9yICh1aW50MjU2IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgSUVSQzIwVG9rZW4gdCA9IElFUkMyMFRva2VuKHBtLnRva2VucyhpKSk7CiAgICAgICAgICAgIGVzY3Jvd0JhbGFuY2Vbb3duZXJdW3RdICs9IGFtb3VudDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVmdW5kQnVuZGxlKAogICAgICAgIFRva2VuUHJlZGljdGlvbk1hcmtldCBwbSwKICAgICAgICB1aW50MjU2IGFtb3VudAogICAgKQogICAgICAgIGludGVybmFsCiAgICB7CiAgICAgICAgLy8gYXBwcm92ZSB0cmFuc2ZlciBvZiBidW5kbGUgYW5kIGFkanVzdCBlc2Nyb3cKICAgICAgICB1aW50MjU2IGxlbmd0aCA9IHBtLm91dGNvbWVDb3VudCgpOwogICAgICAgIGZvciAodWludDI1NiBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIElFUkMyMFRva2VuIHQgPSBJRVJDMjBUb2tlbihwbS50b2tlbnMoaSkpOwogICAgICAgICAgICB0LmFwcHJvdmUocG0sIGFtb3VudCk7CiAgICAgICAgICAgIGVzY3Jvd0JhbGFuY2Vbb3duZXJdW3RdIC09IGFtb3VudDsKICAgICAgICB9CgogICAgICAgIC8vIHJlZnVuZCB0aGUgYnVuZGxlCiAgICAgICAgcG0ucmVmdW5kQnVuZGxlKGFtb3VudCk7CgogICAgICAgIC8vIHRyYW5zZmVyIHRoZSByZWNlaXZlZCB0b2tlbnMgdG8gb3duZXIKICAgICAgICBJRVJDMjBUb2tlbiB3dCA9IHBtLndhZ2VydG9rZW4oKTsKICAgICAgICBlc2Nyb3dCYWxhbmNlW293bmVyXVt3dF0gKz0gYW1vdW50OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1eU9yUmVmdW5kQnVuZGxlcygKICAgICAgICBUb2tlblByZWRpY3Rpb25NYXJrZXRbXSBwbXMsCiAgICAgICAgaW50MjU2W10gYW1vdW50cwogICAgKQogICAgICAgIGludGVybmFsCiAgICB7CiAgICAgICAgZm9yICh1aW50MjU2IGkgPSAwOyBpIDwgcG1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhbW91bnRzW2ldID4gMCkgewogICAgICAgICAgICAgICAgYnV5QnVuZGxlKHBtc1tpXSwgdWludDI1NihhbW91bnRzW2ldKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZWZ1bmRCdW5kbGUocG1zW2ldLCB1aW50MjU2KC1hbW91bnRzW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZXhlY3V0ZVdhZ2VycygKICAgICAgICBhZGRyZXNzW10gc2VsbGVycywKICAgICAgICBJRVJDMjBUb2tlbltdIHNlbGxUb2tlbnMsCiAgICAgICAgdWludDI1NltdIHNlbGxBbW91bnRzLAogICAgICAgIElFUkMyMFRva2VuW10gcmVjZWl2ZVRva2VucywKICAgICAgICB1aW50MjU2W10gcmVjZWl2ZUFtb3VudHMsCiAgICAgICAgdWludDI1NltdIHRpbWVMaW1pdHMsCiAgICAgICAgdWludDI1NltdIG5vbmNlcywKICAgICAgICBieXRlczMyW10gcnMsCiAgICAgICAgYnl0ZXMzMltdIHNzLAogICAgICAgIHVpbnQ4W10gdnMsCiAgICAgICAgVG9rZW5QcmVkaWN0aW9uTWFya2V0W10gcG1zLAogICAgICAgIGludDI1NltdIGJ1bmRsZUFtb3VudHMKICAgICkKICAgICAgICBwdWJsaWMKICAgIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIpOwoKICAgICAgICBhY2NlcHRPZmZlcnMoCiAgICAgICAgICAgIHNlbGxlcnMsCiAgICAgICAgICAgIHNlbGxUb2tlbnMsCiAgICAgICAgICAgIHNlbGxBbW91bnRzLAogICAgICAgICAgICByZWNlaXZlVG9rZW5zLAogICAgICAgICAgICByZWNlaXZlQW1vdW50cywKICAgICAgICAgICAgdGltZUxpbWl0cywKICAgICAgICAgICAgbm9uY2VzLAogICAgICAgICAgICBycywKICAgICAgICAgICAgc3MsCiAgICAgICAgICAgIHZzCiAgICAgICAgKTsKCiAgICAgICAgZ2F0aGVyT2ZmZXJzKHNlbGxlcnMsIHNlbGxUb2tlbnMsIHNlbGxBbW91bnRzKTsKCiAgICAgICAgYnV5T3JSZWZ1bmRCdW5kbGVzKHBtcywgYnVuZGxlQW1vdW50cyk7CgogICAgICAgIGRpc3RyaWJ1dGVPZmZlcnMoc2VsbGVycywgcmVjZWl2ZVRva2VucywgcmVjZWl2ZUFtb3VudHMpOwogICAgfQp9Cg==&#34; download=&#39;bookmaker.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;clearinghouse.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;wagertokenpredictionmarket.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bookmaker&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Clearinghouse&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Clearinghouse&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// approve transfer of payment tokens&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// buy the bundle&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer bundle from this to owner and adjust escrow&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcomeCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// approve transfer of bundle and adjust escrow&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcomeCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// refund the bundle&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer the received tokens to owner&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pm&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyOrRefundBundles&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;int256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]));&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(-&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]));&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;executeWagers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;int256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bundleAmounts&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;acceptOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gatherOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;buyOrRefundBundles&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pms&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bundleAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;distributeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Betting Tokens In A Prediction Market</title>
      <link>https://programtheblockchain.com/posts/2018/06/12/betting-tokens-in-a-prediction-market/</link>
      <pubDate>Tue, 12 Jun 2018 07:37:58 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/12/betting-tokens-in-a-prediction-market/</guid>
      <description>&lt;p&gt;This post will describe how to implement a prediction market where bets are for ERC20 tokens rather than ether.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;My previous
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/22/writing-a-prediction-market-contract/&#34;&gt;post on prediction markets&lt;/a&gt;
supported betting ether.  For some applications, it&amp;rsquo;s important to have the betting currency be ERC20 tokens, so I&amp;rsquo;m going to alter that previous implementation to accept tokens rather than ether.  Note that it&amp;rsquo;s possible to
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-token/&#34;&gt;wrap ether in a token&lt;/a&gt;,
so this new contract will be strictly more general than the previous one.&lt;/p&gt;

&lt;p&gt;Just like the previous prediction market contract, this contract will inherit the routines of the &lt;code&gt;WagerBase&lt;/code&gt; contract, so all I need to do is to create the appropriate constructor and routines that accept and pay off bets.  It&amp;rsquo;s a good idea to be familiar with that
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/22/writing-a-prediction-market-contract/&#34;&gt;post&lt;/a&gt;
before going further here.&lt;/p&gt;

&lt;h2 id=&#34;token-based-prediction-market&#34;&gt;Token-Based Prediction Market&lt;/h2&gt;

&lt;p&gt;Like the ether-based prediction market contract, this contract requires a proposition and possible outcomes.  This contract also requires which ERC20 token will be the wagered token (as opposed to ether).&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;wagerbase.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_wagertoken&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Just forward the parameters to the base constructor.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;buying-bundles&#34;&gt;Buying Bundles&lt;/h2&gt;

&lt;p&gt;Outcome tokens are now bought in exchange for wagered tokens.  The bettor must have approved the transfer of those wagered tokens prior to calling &lt;code&gt;buyBundle&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
        &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;failed wagertoken transfer&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The bundle to tokens are minted for the purchase.&lt;/p&gt;

&lt;h2 id=&#34;refunding-bundles&#34;&gt;Refunding Bundles&lt;/h2&gt;

&lt;p&gt;Complete bundles of outcome tokens can be exchanged for wagered tokens.  The bettor must approve the outcome tokens for transfer before calling &lt;code&gt;refundBundle&lt;/code&gt;.  Tokens representing each outcome are burned.  The wagered tokens are transferred directly back to &lt;code&gt;msg.sender&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
        &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;failed wagertoken transfer&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;claiming-winnings&#34;&gt;Claiming Winnings&lt;/h2&gt;

&lt;p&gt;Once the contract is in the &lt;code&gt;Resolved&lt;/code&gt; state, the winning tokens can be redeemed for wagered tokens.  The bettor must have approved the transfer of the winning tokens prior to calling &lt;code&gt;claim&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
        &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;failed wagertoken transfer&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Winning tokens are burned so that they may not be redeemed again.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Accepting a token is more general than accepting ether, because ether can be wrapped in an ERC20 token.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WagerBase&lt;/code&gt; is the basis for this token-wagering prediction market contract.&lt;/li&gt;
&lt;li&gt;The bet-handling routines are nearly identical to their ether-handling cousins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source&#34;&gt;Full Source&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;wagertokenpredictionmarket.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgIndhZ2VyYmFzZS5zb2wiOwppbXBvcnQgImllcmMyMHRva2VuLnNvbCI7Cgpjb250cmFjdCBUb2tlblByZWRpY3Rpb25NYXJrZXQgaXMgV2FnZXJCYXNlIHsKICAgIElFUkMyMFRva2VuIHB1YmxpYyB3YWdlcnRva2VuOwoKICAgIGNvbnN0cnVjdG9yKAogICAgICAgIHN0cmluZyBfcHJvcG9zaXRpb24sCiAgICAgICAgYnl0ZXMzMltdIF9vdXRjb21lcywKICAgICAgICBieXRlczMyW10gX3N5bWJvbHMsCiAgICAgICAgdWludDI1NiB0aW1lb3V0RGVsYXksCiAgICAgICAgSUVSQzIwVG9rZW4gX3dhZ2VydG9rZW4KICAgICkKICAgICAgICAvLyBKdXN0IGZvcndhcmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGJhc2UgY29uc3RydWN0b3IuCiAgICAgICAgV2FnZXJCYXNlKF9wcm9wb3NpdGlvbiwgX291dGNvbWVzLCBfc3ltYm9scywgdGltZW91dERlbGF5KQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIHdhZ2VydG9rZW4gPSBfd2FnZXJ0b2tlbjsKICAgIH0KCiAgICBmdW5jdGlvbiBidXlCdW5kbGUodWludDI1NiBhbW91bnQpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZSh3YWdlcnRva2VuLnRyYW5zZmVyRnJvbShtc2cuc2VuZGVyLCBhZGRyZXNzKHRoaXMpLCBhbW91bnQpLAogICAgICAgICAgICAiZmFpbGVkIHdhZ2VydG9rZW4gdHJhbnNmZXIiKTsKCiAgICAgICAgZm9yICh1aW50MjU2IGkgPSAwOyBpIDwgb3V0Y29tZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdG9rZW5zW2ldLm1pbnQobXNnLnNlbmRlciwgYW1vdW50KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVmdW5kQnVuZGxlKHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgewogICAgICAgIGZvciAodWludDI1NiBpID0gMDsgaSA8IG91dGNvbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRva2Vuc1tpXS5idXJuRnJvbShtc2cuc2VuZGVyLCBhbW91bnQpOwogICAgICAgIH0KCiAgICAgICAgcmVxdWlyZSh3YWdlcnRva2VuLnRyYW5zZmVyKG1zZy5zZW5kZXIsIGFtb3VudCksCiAgICAgICAgICAgICJmYWlsZWQgd2FnZXJ0b2tlbiB0cmFuc2ZlciIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYWltKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5SZXNvbHZlZCk7CgogICAgICAgIHVpbnQyNTYgYW1vdW50ID0gdG9rZW5zW3dpbm5pbmdPdXRjb21lXS5iYWxhbmNlT2YobXNnLnNlbmRlcik7CiAgICAgICAgdG9rZW5zW3dpbm5pbmdPdXRjb21lXS5idXJuRnJvbShtc2cuc2VuZGVyLCBhbW91bnQpOwoKICAgICAgICByZXF1aXJlKHdhZ2VydG9rZW4udHJhbnNmZXIobXNnLnNlbmRlciwgYW1vdW50KSwKICAgICAgICAgICAgImZhaWxlZCB3YWdlcnRva2VuIHRyYW5zZmVyIik7CiAgICB9Cn0K&#34; download=&#39;wagertokenpredictionmarket.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;wagerbase.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenPredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_wagertoken&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Just forward the parameters to the base constructor.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;failed wagertoken transfer&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;failed wagertoken transfer&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;wagertoken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;failed wagertoken transfer&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Reversible Ether</title>
      <link>https://programtheblockchain.com/posts/2018/06/09/reversible-ether/</link>
      <pubDate>Sat, 09 Jun 2018 09:13:25 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/09/reversible-ether/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll develop an ERC20 token that acts as &amp;ldquo;reversible ether&amp;rdquo; as described by Ethereum&amp;rsquo;s creator, Vitalik Buterin:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Someone should come along and issue an ERC20 called &#34;Reversible Ether&#34; that is 1:1 backed by ether but has a DAO that can revert transfers within N days.&lt;/p&gt;
&lt;p&gt;&lt;cite class=&#34;f6 ttu tracked fs-normal&#34;&gt;&amp;ndash;Vitalik Buterin, &lt;a href=&#34;https://twitter.com/vitalikbuterin/status/987262267036184577&#34;&gt;April 2018&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This idea is intriguing. In the world of credit cards and banks, it&amp;rsquo;s often possible to reverse transactions in the case of mistakes or fraud. In the world of cryptocurrencies, every transaction is final and irreversible. Vitalik&amp;rsquo;s tweet about &amp;ldquo;reversible ether&amp;rdquo; suggests doing two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wrap ether in a token that allows for reversals.&lt;/li&gt;
&lt;li&gt;Use a &lt;a href=&#34;https://www.ethereum.org/dao&#34;&gt;decentralized autonomous organization (DAO)&lt;/a&gt; to decide by group consensus what transactions should be reversed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this post, I&amp;rsquo;ll focus on just the first challenge. I&amp;rsquo;ll show how an ERC20 token can keep track of pending transfers and allow a trusted third party to reverse them. My &amp;ldquo;reversible ether&amp;rdquo; implementation will be based on the &lt;code&gt;EtherToken&lt;/code&gt; contract we introduced in our post about &lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-token/&#34;&gt;wrapping ether in an ERC20 token&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;parameterization&#34;&gt;Parameterization&lt;/h2&gt;

&lt;p&gt;Like &lt;code&gt;EtherToken&lt;/code&gt;, &lt;code&gt;ReversibleEther&lt;/code&gt; accepts a name and symbol for the token. It also accepts an &lt;code&gt;escrowDuration&lt;/code&gt;, which specifies how long a transfer stays &amp;ldquo;pending.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;During that escrow period, a transfer can be reversed by a trusted &lt;code&gt;arbiter&lt;/code&gt; account. (Keep in mind that the &lt;code&gt;arbiter&lt;/code&gt; account could very well be a smart contract that implements some sort of group consensus protocol.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ReversibleEther&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EtherToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arbiter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;EtherToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;arbiter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;two-balances-and-erc20-compatibility&#34;&gt;Two Balances and ERC20 Compatibility&lt;/h2&gt;

&lt;p&gt;Most ERC20 tokens have a straightforward notion of account balances: when a token is transferred to an account, that account&amp;rsquo;s balance increases by one token. That token can immediately be spent by transferring it to another account.&lt;/p&gt;

&lt;p&gt;A reversible ether token can&amp;rsquo;t work that way. When a token is transferred, it is &lt;em&gt;not&lt;/em&gt; immediately available to be spent. The transfer might be reversed until some escrow period has passed, e.g. 30 days.&lt;/p&gt;

&lt;p&gt;My reversible ether implementation will keep track of &lt;em&gt;two&lt;/em&gt; balances for each account. The first balance is just the typical ERC20 &lt;code&gt;balanceOf&lt;/code&gt;. It is immediately updated for each token transfer.&lt;/p&gt;

&lt;p&gt;The second balance is called &lt;code&gt;availableBalanceOf&lt;/code&gt;, and it tracks what portion of an account&amp;rsquo;s &lt;code&gt;balanceOf&lt;/code&gt; is currently available to be spent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// balanceOf is inherited from EtherToken&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are a number of ways to keep track of these balances, but using a &lt;code&gt;balanceOf&lt;/code&gt; that is immediately updated on each transfer maximizes compatibility with &lt;a href=&#34;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md&#34;&gt;the ERC20 token standard&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;buying-and-selling-reversible-ether&#34;&gt;Buying and Selling Reversible Ether&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ReversibleEther&lt;/code&gt; inherits &lt;code&gt;buy()&lt;/code&gt; and &lt;code&gt;sell()&lt;/code&gt; functions from &lt;code&gt;EtherToken&lt;/code&gt;, but those functions need to be overridden to adjust &lt;code&gt;availableBalanceOf&lt;/code&gt; correctly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient funds.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;keeping-track-of-pending-transfers&#34;&gt;Keeping Track of Pending Transfers&lt;/h2&gt;

&lt;p&gt;A token transfer immediately updates &lt;code&gt;balanceOf&lt;/code&gt;, as in a typical ERC20 transfer, but it does &lt;em&gt;not&lt;/em&gt; update &lt;code&gt;availableBalanceOf&lt;/code&gt;. Instead, pending transfers are tracked in a global array and a per-recipient set:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// index into pendingTransferSet[to]&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// global array of pending transfers&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// per-recipient set of pending transfer (for ease of enumeration)&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[])&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;finalTimestamp&lt;/code&gt; keeps track of when the transfer can be considered final. After this time, it cannot be reversed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pendingTransfers&lt;/code&gt; is a global array of all pending transfers. As pending transfers are deleted, the array will become sparse. Slots are never reused, so this array gives each transfer a unique and unchanging ID.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setIndex&lt;/code&gt; and &lt;code&gt;pendingTransferSet&lt;/code&gt; are used together to implement a set, as described in my recent post &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/&#34;&gt;Storage Patterns: Set&lt;/a&gt;.&amp;rdquo; This makes it easy for a recipient to enumerate their pending transfers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The internal helper function &lt;code&gt;startTransfer()&lt;/code&gt; updates the appropriate data structures with the incoming transfer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient funds.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Add to set of pending transfers for the recipient.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;newIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Add to global array of pending transfers.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sender&amp;rsquo;s &lt;code&gt;availableBalanceOf&lt;/code&gt; is checked and updated to reflect the transfer. (&lt;code&gt;balanceOf&lt;/code&gt; is updated through the typical ERC20 transfer functions.)&lt;/li&gt;
&lt;li&gt;The recipient&amp;rsquo;s &lt;code&gt;pendingTransferSet&lt;/code&gt; is updated to include the ID of the new pending transfer.&lt;/li&gt;
&lt;li&gt;The new pending transfer is appended to &lt;code&gt;pendingTransfers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finalTimestamp&lt;/code&gt; is set to &lt;code&gt;escrowDuration&lt;/code&gt; in the future.&lt;/li&gt;
&lt;li&gt;An event is emitted to make it easy for clients to know that the transfer is now pending.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The standard &lt;code&gt;transfer()&lt;/code&gt; and &lt;code&gt;transferFrom()&lt;/code&gt; inherited from &lt;code&gt;EtherToken&lt;/code&gt; need to be overridden to call &lt;code&gt;startTransfer()&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;startTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;startTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that &lt;code&gt;EtherToken&lt;/code&gt;&amp;rsquo;s implementations of &lt;code&gt;transfer()&lt;/code&gt; and &lt;code&gt;transferFrom()&lt;/code&gt; are guaranteed to either revert or return &lt;code&gt;true&lt;/code&gt;. Otherwise, I would need to check their return values.&lt;/p&gt;

&lt;h2 id=&#34;finalizing-transfers&#34;&gt;Finalizing Transfers&lt;/h2&gt;

&lt;p&gt;Once the escrow period has elapsed, a pending transfer can be considered final. The &lt;code&gt;finalizeTransfer()&lt;/code&gt; function updates the recipient&amp;rsquo;s &lt;code&gt;availableBalanceOf&lt;/code&gt; and removes the transfer from the pending transfer data structures:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Finalized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;finalizeTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Finalized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;deletePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that anyone can call this function, but it will likely be called by the recipient of the transfer. The &lt;code&gt;pendingTransferSet&lt;/code&gt; makes it easy for a recipient to enumerate all their pending transfers and finalize those that are ready.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deletePendingTransfer()&lt;/code&gt; is a helper function that is responsible for cleaning up the data structures. Notably, it implements the swapping algorithm from &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/&#34;&gt;Storage Patterns: Set&lt;/a&gt;.&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deletePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Swap with last element.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Shrink the set and delete the pending transfer.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;reversing-transfers&#34;&gt;Reversing Transfers&lt;/h2&gt;

&lt;p&gt;During the escrow period, it&amp;rsquo;s possible for the trusted third-party arbiter to reverse the transfer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Reversed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reversePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arbiter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// All changes to balanceOf should emit ERC20 Transfer events.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Reversed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;deletePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of that code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only the &lt;code&gt;arbiter&lt;/code&gt; is allowed to reverse transfers.&lt;/li&gt;
&lt;li&gt;Transfers can only be reversed during the escrow period.&lt;/li&gt;
&lt;li&gt;Reversing a transfer updates &lt;code&gt;balanceOf&lt;/code&gt; for both accounts.&lt;/li&gt;
&lt;li&gt;An ERC20 &lt;code&gt;Transfer&lt;/code&gt; event is emitted to reflect the change in balances.&lt;/li&gt;
&lt;li&gt;The recipient&amp;rsquo;s &lt;code&gt;availableBalanceOf&lt;/code&gt; increases, because those funds are immediately available for spending.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Reversed&lt;/code&gt; event makes it easy for clients to observe the reversal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deletePendingTransfer()&lt;/code&gt; is used again here to clean up the pending transfer data structures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reversible ether is a &amp;ldquo;wrapped ether&amp;rdquo; token that allows transfers to be reversed within a given escrow period.&lt;/li&gt;
&lt;li&gt;To support reversals, the token must keep track of two balances: the total amount of tokens owned and the amount currently available for spending.&lt;/li&gt;
&lt;li&gt;When building a token with new semantics, it&amp;rsquo;s important to consider compatibility with existing standards and tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;reversibleether.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgImV0aGVydG9rZW4uc29sIjsKCmNvbnRyYWN0IFJldmVyc2libGVFdGhlciBpcyBFdGhlclRva2VuIHsKICAgIGFkZHJlc3MgYXJiaXRlcjsKICAgIHVpbnQyNTYgZXNjcm93RHVyYXRpb247CgogICAgY29uc3RydWN0b3Ioc3RyaW5nIF9uYW1lLCBzdHJpbmcgX3N5bWJvbCwgdWludDI1NiBfZXNjcm93RHVyYXRpb24pCiAgICAgICAgRXRoZXJUb2tlbihfbmFtZSwgX3N5bWJvbCkKICAgICAgICBwdWJsaWMKICAgIHsKICAgICAgICBhcmJpdGVyID0gbXNnLnNlbmRlcjsKICAgICAgICBlc2Nyb3dEdXJhdGlvbiA9IF9lc2Nyb3dEdXJhdGlvbjsKICAgIH0KCiAgICAvLyBiYWxhbmNlT2YgaXMgaW5oZXJpdGVkIGZyb20gRXRoZXJUb2tlbgoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgYXZhaWxhYmxlQmFsYW5jZU9mOwoKICAgIGZ1bmN0aW9uIGJ1eSgpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICBzdXBlci5idXkoKTsKICAgICAgICBhdmFpbGFibGVCYWxhbmNlT2ZbbXNnLnNlbmRlcl0gKz0gbXNnLnZhbHVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGwodWludDI1NiBhbW91bnQpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShhdmFpbGFibGVCYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPj0gYW1vdW50LCAiSW5zdWZmaWNpZW50IGZ1bmRzLiIpOwoKICAgICAgICBzdXBlci5zZWxsKGFtb3VudCk7CiAgICAgICAgYXZhaWxhYmxlQmFsYW5jZU9mW21zZy5zZW5kZXJdIC09IGFtb3VudDsKICAgIH0KCiAgICBzdHJ1Y3QgUGVuZGluZ1RyYW5zZmVyIHsKICAgICAgICBhZGRyZXNzIGZyb207CiAgICAgICAgYWRkcmVzcyB0bzsKICAgICAgICB1aW50MjU2IGFtb3VudDsKICAgICAgICB1aW50MjU2IGZpbmFsVGltZXN0YW1wOwogICAgICAgIHVpbnQyNTYgc2V0SW5kZXg7ICAvLyBpbmRleCBpbnRvIHBlbmRpbmdUcmFuc2ZlclNldFt0b10KICAgIH0KCiAgICAvLyBnbG9iYWwgYXJyYXkgb2YgcGVuZGluZyB0cmFuc2ZlcnMKICAgIFBlbmRpbmdUcmFuc2ZlcltdIHB1YmxpYyBwZW5kaW5nVHJhbnNmZXJzOwoKICAgIC8vIHBlci1yZWNpcGllbnQgc2V0IG9mIHBlbmRpbmcgdHJhbnNmZXIgKGZvciBlYXNlIG9mIGVudW1lcmF0aW9uKQogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IHVpbnQyNTZbXSkgcHVibGljIHBlbmRpbmdUcmFuc2ZlclNldDsKCiAgICBldmVudCBQZW5kaW5nKGFkZHJlc3MgaW5kZXhlZCBmcm9tLCBhZGRyZXNzIGluZGV4ZWQgdG8sIHVpbnQyNTYgaW5kZXgpOwoKICAgIGZ1bmN0aW9uIHN0YXJ0VHJhbnNmZXIoYWRkcmVzcyBmcm9tLCBhZGRyZXNzIHRvLCB1aW50MjU2IHZhbHVlKSBpbnRlcm5hbCB7CiAgICAgICAgcmVxdWlyZShhdmFpbGFibGVCYWxhbmNlT2ZbZnJvbV0gPj0gdmFsdWUsICJJbnN1ZmZpY2llbnQgZnVuZHMuIik7CiAgICAgICAgYXZhaWxhYmxlQmFsYW5jZU9mW2Zyb21dIC09IHZhbHVlOwoKICAgICAgICAvLyBBZGQgdG8gc2V0IG9mIHBlbmRpbmcgdHJhbnNmZXJzIGZvciB0aGUgcmVjaXBpZW50LgogICAgICAgIHVpbnQyNTYgbmV3SW5kZXggPSBwZW5kaW5nVHJhbnNmZXJzLmxlbmd0aDsKICAgICAgICBwZW5kaW5nVHJhbnNmZXJTZXRbdG9dLnB1c2gobmV3SW5kZXgpOwoKICAgICAgICAvLyBBZGQgdG8gZ2xvYmFsIGFycmF5IG9mIHBlbmRpbmcgdHJhbnNmZXJzLgogICAgICAgIHBlbmRpbmdUcmFuc2ZlcnMucHVzaChQZW5kaW5nVHJhbnNmZXIoewogICAgICAgICAgICBmcm9tOiBmcm9tLAogICAgICAgICAgICB0bzogdG8sCiAgICAgICAgICAgIGFtb3VudDogdmFsdWUsCiAgICAgICAgICAgIGZpbmFsVGltZXN0YW1wOiBub3cgKyBlc2Nyb3dEdXJhdGlvbiwKICAgICAgICAgICAgc2V0SW5kZXg6IHBlbmRpbmdUcmFuc2ZlclNldFt0b10ubGVuZ3RoIC0gMQogICAgICAgIH0pKTsKCiAgICAgICAgZW1pdCBQZW5kaW5nKGZyb20sIHRvLCBuZXdJbmRleCk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmZXIoYWRkcmVzcyB0bywgdWludDI1NiB2YWx1ZSkgcHVibGljIHJldHVybnMgKGJvb2wpIHsKICAgICAgICBzdGFydFRyYW5zZmVyKG1zZy5zZW5kZXIsIHRvLCB2YWx1ZSk7CiAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zZmVyKHRvLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmZXJGcm9tKGFkZHJlc3MgZnJvbSwgYWRkcmVzcyB0bywgdWludDI1NiB2YWx1ZSkKICAgICAgICBwdWJsaWMKICAgICAgICByZXR1cm5zIChib29sKQogICAgewogICAgICAgIHN0YXJ0VHJhbnNmZXIoZnJvbSwgdG8sIHZhbHVlKTsKICAgICAgICByZXR1cm4gc3VwZXIudHJhbnNmZXJGcm9tKGZyb20sIHRvLCB2YWx1ZSk7CiAgICB9CgogICAgZXZlbnQgRmluYWxpemVkKGFkZHJlc3MgaW5kZXhlZCBmcm9tLCBhZGRyZXNzIGluZGV4ZWQgdG8sIHVpbnQyNTYgaW5kZXgpOwogICAgZnVuY3Rpb24gZmluYWxpemVUcmFuc2Zlcih1aW50MjU2IGluZGV4KSBwdWJsaWMgewogICAgICAgIFBlbmRpbmdUcmFuc2ZlciBzdG9yYWdlIHBlbmRpbmcgPSBwZW5kaW5nVHJhbnNmZXJzW2luZGV4XTsKCiAgICAgICAgcmVxdWlyZShub3cgPj0gcGVuZGluZy5maW5hbFRpbWVzdGFtcCk7CgogICAgICAgIGF2YWlsYWJsZUJhbGFuY2VPZltwZW5kaW5nLnRvXSArPSBwZW5kaW5nLmFtb3VudDsKICAgICAgICBlbWl0IEZpbmFsaXplZChwZW5kaW5nLmZyb20sIHBlbmRpbmcudG8sIGluZGV4KTsKCiAgICAgICAgZGVsZXRlUGVuZGluZ1RyYW5zZmVyKGluZGV4KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWxldGVQZW5kaW5nVHJhbnNmZXIodWludDI1NiBpbmRleCkgaW50ZXJuYWwgewogICAgICAgIFBlbmRpbmdUcmFuc2ZlciBzdG9yYWdlIHBlbmRpbmcgPSBwZW5kaW5nVHJhbnNmZXJzW2luZGV4XTsKCiAgICAgICAgdWludDI1NiBzZXRJbmRleCA9IHBlbmRpbmcuc2V0SW5kZXg7CiAgICAgICAgdWludDI1NltdIHN0b3JhZ2Ugc2V0ID0gcGVuZGluZ1RyYW5zZmVyU2V0W3BlbmRpbmcudG9dOwoKICAgICAgICAvLyBTd2FwIHdpdGggbGFzdCBlbGVtZW50LgogICAgICAgIHVpbnQyNTYgbGFzdFZhbHVlID0gc2V0W3NldC5sZW5ndGggLSAxXTsKICAgICAgICBzZXRbc2V0SW5kZXhdID0gbGFzdFZhbHVlOwogICAgICAgIHBlbmRpbmdUcmFuc2ZlcnNbbGFzdFZhbHVlXS5zZXRJbmRleCA9IHNldEluZGV4OwoKICAgICAgICAvLyBTaHJpbmsgdGhlIHNldCBhbmQgZGVsZXRlIHRoZSBwZW5kaW5nIHRyYW5zZmVyLgogICAgICAgIHNldC5sZW5ndGggLT0gMTsKICAgICAgICBkZWxldGUgcGVuZGluZ1RyYW5zZmVyc1tpbmRleF07CiAgICB9CgogICAgZXZlbnQgUmV2ZXJzZWQoYWRkcmVzcyBpbmRleGVkIGZyb20sIGFkZHJlc3MgaW5kZXhlZCB0bywgdWludDI1NiBpbmRleCk7CiAgICBmdW5jdGlvbiByZXZlcnNlUGVuZGluZ1RyYW5zZmVyKHVpbnQyNTYgaW5kZXgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IGFyYml0ZXIpOwoKICAgICAgICBQZW5kaW5nVHJhbnNmZXIgc3RvcmFnZSBwZW5kaW5nID0gcGVuZGluZ1RyYW5zZmVyc1tpbmRleF07CgogICAgICAgIHJlcXVpcmUobm93IDwgcGVuZGluZy5maW5hbFRpbWVzdGFtcCk7CgogICAgICAgIGJhbGFuY2VPZltwZW5kaW5nLnRvXSAtPSBwZW5kaW5nLmFtb3VudDsKICAgICAgICBiYWxhbmNlT2ZbcGVuZGluZy5mcm9tXSArPSBwZW5kaW5nLmFtb3VudDsKICAgICAgICAvLyBBbGwgY2hhbmdlcyB0byBiYWxhbmNlT2Ygc2hvdWxkIGVtaXQgRVJDMjAgVHJhbnNmZXIgZXZlbnRzLgogICAgICAgIGVtaXQgVHJhbnNmZXIocGVuZGluZy50bywgcGVuZGluZy5mcm9tLCBwZW5kaW5nLmFtb3VudCk7CgogICAgICAgIGF2YWlsYWJsZUJhbGFuY2VPZltwZW5kaW5nLmZyb21dICs9IHBlbmRpbmcuYW1vdW50OwogICAgICAgIGVtaXQgUmV2ZXJzZWQocGVuZGluZy5mcm9tLCBwZW5kaW5nLnRvLCBpbmRleCk7CgogICAgICAgIGRlbGV0ZVBlbmRpbmdUcmFuc2ZlcihpbmRleCk7CiAgICB9CgogICAgZnVuY3Rpb24gcGVuZGluZ1RyYW5zZmVyQ291bnQoYWRkcmVzcyBhZGRyKQogICAgICAgIHB1YmxpYwogICAgICAgIHZpZXcKICAgICAgICByZXR1cm5zICh1aW50MjU2KQogICAgewogICAgICAgIHJldHVybiBwZW5kaW5nVHJhbnNmZXJTZXRbYWRkcl0ubGVuZ3RoOwogICAgfQp9Cg==&#34; download=&#39;reversibleether.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ethertoken.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ReversibleEther&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EtherToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arbiter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;EtherToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;arbiter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// balanceOf is inherited from EtherToken&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient funds.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// index into pendingTransferSet[to]&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// global array of pending transfers&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// per-recipient set of pending transfer (for ease of enumeration)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[])&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient funds.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Add to set of pending transfers for the recipient.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;newIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Add to global array of pending transfers.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;startTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;startTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Finalized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;finalizeTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Finalized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;deletePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deletePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Swap with last element.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;setIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Shrink the set and delete the pending transfer.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;set&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Reversed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reversePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arbiter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;PendingTransfer&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransfers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;finalTimestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// All changes to balanceOf should emit ERC20 Transfer events.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;availableBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Reversed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pending&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;deletePendingTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pendingTransferSet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;addr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Supporting Off-Chain Token Trading</title>
      <link>https://programtheblockchain.com/posts/2018/06/06/supporting-off-chain-token-trading/</link>
      <pubDate>Wed, 06 Jun 2018 07:56:25 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/06/supporting-off-chain-token-trading/</guid>
      <description>&lt;p&gt;This post will implement a token trading &amp;ldquo;clearinghouse&amp;rdquo; that will execute multiple signed trade offers simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A clearinghouse accepts trade offers from multiple parties and works to execute transactions among those parties.  A clearinghouse may also act as a market maker and directly trade with those parties.  In this post, the trades will be exchanges of ERC20 tokens for other ERC20 tokens.&lt;/p&gt;

&lt;p&gt;For example, the clearinghouse could execute a pair of perfectly matched trades like the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X wants to trade 1 P for 1 Q (where P and Q are different tokens)&lt;/li&gt;
&lt;li&gt;Y wants to trade 1 Q for 1 P&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A more interesting example would be the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X wants to trade 3 P&amp;rsquo;s for 3 Q&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;Y wants to trade 2 Q&amp;rsquo;s for 2 P&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;Z wants to trade 1 Q for 1 P&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In that case, a clearinghouse could orchestrate a simultaneous three-way trade.&lt;/p&gt;

&lt;p&gt;While the supported trades will only involve two tokens each, that doesn&amp;rsquo;t mean that an orchestrated trade could not be for many different tokens.  For instance, the following three trades could be supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X wants to trade 1 R for 1 S&lt;/li&gt;
&lt;li&gt;Y wants to trade 1 S for 1 T&lt;/li&gt;
&lt;li&gt;Z wants to trade 1 T for 1 R&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;trade-offers&#34;&gt;Trade Offers&lt;/h2&gt;

&lt;p&gt;Traders will send signed trade offers to the off-chain clearinghouse.  Periodically, the clearinghouse will send some of those signed offers to the smart contract, which will then execute the proposed trades.&lt;/p&gt;

&lt;p&gt;Signed trade offers have many components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;token&lt;/strong&gt; and &lt;strong&gt;amount&lt;/strong&gt; of that token being &lt;strong&gt;offered&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;token&lt;/strong&gt; and &lt;strong&gt;amount&lt;/strong&gt; of that token expected to be &lt;strong&gt;received&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;expiration time&lt;/strong&gt; after which this offer is no longer valid.&lt;/li&gt;
&lt;li&gt;A unique &lt;strong&gt;nonce&lt;/strong&gt; to prevent replay vulnerabilities.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;signature&lt;/strong&gt; that proves the seller&amp;rsquo;s identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mechanism for signing a message and subsequently validating it within a contract were described in
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;our post on signed messages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are two components in this system: an off-chain clearinghouse that puts trades together and a smart contract that executes those trades. In this post, I&amp;rsquo;ll focus on just the smart contract.&lt;/p&gt;

&lt;h2 id=&#34;escrowed-tokens&#34;&gt;Escrowed Tokens&lt;/h2&gt;

&lt;p&gt;This system will rely on escrowed tokens from sellers to back their trade offers.  I use our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/30/escrowing-erc20-tokens/&#34;&gt;escrow contract&lt;/a&gt;
to manage the escrow mechanics.  The &lt;code&gt;Escrow&lt;/code&gt; contract handles token deposits and withdrawals for traders as well as for the clearinghouse&amp;rsquo;s owner.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;signature.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;escrow.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Clearinghouse&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Escrow&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Signature&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Escrow&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In addition to configuring escrow duration, the constructor also records the &lt;code&gt;owner&lt;/code&gt; of the contract.  Only the owner can submit signed trades to be executed.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Clearinghouse&lt;/code&gt; inherits from &lt;code&gt;Signature&lt;/code&gt;, which provides routines for handling signed messages.  Its source code is provided at the end of this post.&lt;/p&gt;

&lt;h2 id=&#34;validating-a-sale-offer&#34;&gt;Validating a Sale Offer&lt;/h2&gt;

&lt;p&gt;The only difference between validating a signed message in this contract and the technique we described
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;previously&lt;/a&gt;
is the encoding of the signature.  Previously, we used a single byte sequence containing the &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;s&lt;/code&gt;, and &lt;code&gt;v&lt;/code&gt; components, but now I&amp;rsquo;m going to keep those values separate.  (I&amp;rsquo;m doing so to overcome a Solidity limitation, which I&amp;rsquo;ll point out when it&amp;rsquo;s relevant.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;validateOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Offer has expired.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Duplicate nonce.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Invalid signature.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A valid message meets three criteria:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The trade must not have expired.&lt;/li&gt;
&lt;li&gt;The trade must have an unused nonce.&lt;/li&gt;
&lt;li&gt;The trade offer&amp;rsquo;s signature must be validated.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;single-sale&#34;&gt;Single Sale&lt;/h2&gt;

&lt;p&gt;A clearinghouse typically executes many trades simultaneously, and this contract will support that.  But first I want to show how to execute a single signed trade offer.  A single trade is between the seller and the clearinghouse:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;executeOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only the owner can execute offers.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;validateOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A few things to note about the single trade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only &lt;code&gt;owner&lt;/code&gt; can submit a signed trade.&lt;/li&gt;
&lt;li&gt;The offer must be validated.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;transfer&lt;/code&gt; function, which is inherited from &lt;code&gt;Escrow&lt;/code&gt;, checks that there are sufficient tokens available and then transfers them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;simultaneous-sales&#34;&gt;Simultaneous Sales&lt;/h2&gt;

&lt;p&gt;The examples at the beginning of the post demonstrated the power of submitting simultaneous trades.  This contract will support simultaneous trades in a single transaction.  Interestingly, processing multiple trades is not as simple as just iterating over the trades and executing them sequentially.&lt;/p&gt;

&lt;p&gt;An example will make it clear why sequential trading won&amp;rsquo;t work.  Recall the example where X wants to trade 1 P for 1 Q and Y wants to do the reverse.  A clearinghouse could broker such a trade because X can provide 1 P to Y, and Y can provide 1 Q to X.  But, it would be impossible for the clearinghouse to complete either trade fully before starting the other trade because the clearinghouse might not own any P or Q tokens.&lt;/p&gt;

&lt;p&gt;How would a real world clearinghouse execute this trade between X and Y?  It would first get 1 P from X and then it would get 1 Q from Y.  After that, it would distribute the Q to X and the P to Y.  That is, it would execute the trades in two phases, first accumulating all the tokens being offered, and then distributing all the tokens being received.&lt;/p&gt;

&lt;p&gt;This contract will validate all the offers, then gather all the tokens before distributing them:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;executeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only the owner can execute offers.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;acceptOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;gatherOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;distributeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the function takes many arrays of simple values, including the &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;s&lt;/code&gt;, and &lt;code&gt;v&lt;/code&gt; values.  It would be more convenient to pass those all in arrays of structs or packed values, but Solidity doesn&amp;rsquo;t yet support that.  That&amp;rsquo;s why they are unpacked.&lt;/p&gt;

&lt;p&gt;The first phase validates all the offers and marks their nonces as used:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;acceptOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;validateOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Gathering all the offered tokens is a simple loop over the offers, transferring them to &lt;code&gt;owner&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;gatherOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Distributing tokens to the sellers is also a simple loop, this time transferring &lt;em&gt;from&lt;/em&gt; &lt;code&gt;owner&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;distributeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;clearinghouse-participation&#34;&gt;Clearinghouse Participation&lt;/h2&gt;

&lt;p&gt;The clearinghouse can participate in trading implicitly.  If the accepted trades do not fully offset each other, it&amp;rsquo;s the clearinghouse contract that must make up the difference.  This is what happens in the single-trade function above, but it can just as easily happen in the multiple-trade function as well.&lt;/p&gt;

&lt;p&gt;Sometimes, accepted trades will work out in the clearinghouse&amp;rsquo;s favor.  Suppose the following trades are offered to the clearinghouse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X offers to trade 1 P for 1 Q&lt;/li&gt;
&lt;li&gt;Y offers to trade 2 Q&amp;rsquo;s for 1 P&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the clearinghouse presents these two trades to the contract, both X and Y will get their respective tokens, but the clearinghouse will own the extra Q afterwards!&lt;/p&gt;

&lt;h2 id=&#34;why-escrow&#34;&gt;Why Escrow?&lt;/h2&gt;

&lt;p&gt;This contract could have been written without escrowed tokens.  It could have relied instead on ERC20&amp;rsquo;s &lt;code&gt;approve&lt;/code&gt; and &lt;code&gt;transferFrom&lt;/code&gt; functions for transferring tokens between parties.  This would have presented a vulnerability that I wanted to avoid: a &lt;code&gt;transferFrom&lt;/code&gt; might fail if tokens became unavailable.  If a &lt;code&gt;transferFrom&lt;/code&gt; failed in a multiple-trade transaction, then all the trades would fail, and I wanted to avoid this possibility.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &amp;ldquo;clearinghouse&amp;rdquo; combines 3rd-party trades, which may not have been acceptable individually.&lt;/li&gt;
&lt;li&gt;A clearinghouse may act as a market maker and participate in trading.&lt;/li&gt;
&lt;li&gt;Signed messages enable the clearinghouse to operate off-chain except for the final simultaneous trading.&lt;/li&gt;
&lt;li&gt;Escrowed tokens enable the clearinghouse to be certain that trading will succeed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;clearinghouse.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgImllcmMyMHRva2VuLnNvbCI7CmltcG9ydCAic2lnbmF0dXJlLnNvbCI7CmltcG9ydCAiZXNjcm93LnNvbCI7Cgpjb250cmFjdCBDbGVhcmluZ2hvdXNlIGlzIEVzY3JvdywgU2lnbmF0dXJlIHsKICAgIGFkZHJlc3Mgb3duZXI7CgogICAgY29uc3RydWN0b3IgKHVpbnQyNTYgX2VzY3Jvd1RpbWUpCiAgICAgICAgRXNjcm93KF9lc2Nyb3dUaW1lKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIG93bmVyID0gbXNnLnNlbmRlcjsKICAgIH0KCiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gbWFwcGluZyh1aW50MjU2ID0&amp;#43;IGJvb2wpKSBwdWJsaWMgdXNlZE5vbmNlczsKCiAgICBmdW5jdGlvbiB2YWxpZGF0ZU9mZmVyKAogICAgICAgIGFkZHJlc3Mgc2VsbGVyLAogICAgICAgIElFUkMyMFRva2VuIHNlbGxUb2tlbiwKICAgICAgICB1aW50MjU2IHNlbGxBbW91bnQsCiAgICAgICAgSUVSQzIwVG9rZW4gcmVjZWl2ZVRva2VuLAogICAgICAgIHVpbnQyNTYgcmVjZWl2ZUFtb3VudCwKICAgICAgICB1aW50MjU2IHRpbWVMaW1pdCwKICAgICAgICB1aW50MjU2IG5vbmNlLAogICAgICAgIGJ5dGVzMzIgciwKICAgICAgICBieXRlczMyIHMsCiAgICAgICAgdWludDggdgogICAgKQogICAgICAgIHB1YmxpYwogICAgICAgIHZpZXcKICAgIHsKICAgICAgICByZXF1aXJlKG5vdyA8IHRpbWVMaW1pdCwgIk9mZmVyIGhhcyBleHBpcmVkLiIpOwogICAgICAgIHJlcXVpcmUoIXVzZWROb25jZXNbc2VsbGVyXVtub25jZV0sICJEdXBsaWNhdGUgbm9uY2UuIik7CgogICAgICAgIGJ5dGVzMzIgbWVzc2FnZSA9IHByZWZpeGVkKAogICAgICAgICAgICBrZWNjYWsyNTYoYWJpLmVuY29kZVBhY2tlZCgKICAgICAgICAgICAgICAgIGFkZHJlc3ModGhpcyksCiAgICAgICAgICAgICAgICBzZWxsVG9rZW4sCiAgICAgICAgICAgICAgICBzZWxsQW1vdW50LAogICAgICAgICAgICAgICAgcmVjZWl2ZVRva2VuLAogICAgICAgICAgICAgICAgcmVjZWl2ZUFtb3VudCwKICAgICAgICAgICAgICAgIHRpbWVMaW1pdCwKICAgICAgICAgICAgICAgIG5vbmNlCiAgICAgICAgICAgICkpCiAgICAgICAgKTsKICAgICAgICByZXF1aXJlKGVjcmVjb3ZlcihtZXNzYWdlLCB2LCByLCBzKSA9PSBzZWxsZXIsICJJbnZhbGlkIHNpZ25hdHVyZS4iKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleGVjdXRlT2ZmZXIoCiAgICAgICAgYWRkcmVzcyBzZWxsZXIsCiAgICAgICAgSUVSQzIwVG9rZW4gc2VsbFRva2VuLAogICAgICAgIHVpbnQyNTYgc2VsbEFtb3VudCwKICAgICAgICBJRVJDMjBUb2tlbiByZWNlaXZlVG9rZW4sCiAgICAgICAgdWludDI1NiByZWNlaXZlQW1vdW50LAogICAgICAgIHVpbnQyNTYgdGltZUxpbWl0LAogICAgICAgIHVpbnQyNTYgbm9uY2UsCiAgICAgICAgYnl0ZXMzMiByLAogICAgICAgIGJ5dGVzMzIgcywKICAgICAgICB1aW50OCB2CgogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBvd25lciwgIk9ubHkgdGhlIG93bmVyIGNhbiBleGVjdXRlIG9mZmVycy4iKTsKCiAgICAgICAgdmFsaWRhdGVPZmZlcigKICAgICAgICAgICAgc2VsbGVyLAogICAgICAgICAgICBzZWxsVG9rZW4sCiAgICAgICAgICAgIHNlbGxBbW91bnQsCiAgICAgICAgICAgIHJlY2VpdmVUb2tlbiwKICAgICAgICAgICAgcmVjZWl2ZUFtb3VudCwKICAgICAgICAgICAgdGltZUxpbWl0LAogICAgICAgICAgICBub25jZSwKICAgICAgICAgICAgciwKICAgICAgICAgICAgcywKICAgICAgICAgICAgdgogICAgICAgICk7CgogICAgICAgIHVzZWROb25jZXNbc2VsbGVyXVtub25jZV0gPSB0cnVlOwoKICAgICAgICB0cmFuc2ZlcihzZWxsZXIsIG93bmVyLCBzZWxsVG9rZW4sIHNlbGxBbW91bnQpOwogICAgICAgIHRyYW5zZmVyKG93bmVyLCBzZWxsZXIsIHJlY2VpdmVUb2tlbiwgcmVjZWl2ZUFtb3VudCk7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGFjY2VwdE9mZmVycygKICAgICAgICBhZGRyZXNzW10gc2VsbGVycywKICAgICAgICBJRVJDMjBUb2tlbltdIHNlbGxUb2tlbnMsCiAgICAgICAgdWludDI1NltdIHNlbGxBbW91bnRzLAogICAgICAgIElFUkMyMFRva2VuW10gcmVjZWl2ZVRva2VucywKICAgICAgICB1aW50MjU2W10gcmVjZWl2ZUFtb3VudHMsCiAgICAgICAgdWludDI1NltdIHRpbWVMaW1pdHMsCiAgICAgICAgdWludDI1NltdIG5vbmNlcywKICAgICAgICBieXRlczMyW10gcnMsCiAgICAgICAgYnl0ZXMzMltdIHNzLAogICAgICAgIHVpbnQ4W10gdnMKICAgICkKICAgICAgICBpbnRlcm5hbAogICAgewogICAgICAgIGZvciAodWludDI1NiBpID0gMDsgaSA8IHNlbGxlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFsaWRhdGVPZmZlcigKICAgICAgICAgICAgICAgIHNlbGxlcnNbaV0sCiAgICAgICAgICAgICAgICBzZWxsVG9rZW5zW2ldLAogICAgICAgICAgICAgICAgc2VsbEFtb3VudHNbaV0sCiAgICAgICAgICAgICAgICByZWNlaXZlVG9rZW5zW2ldLAogICAgICAgICAgICAgICAgcmVjZWl2ZUFtb3VudHNbaV0sCiAgICAgICAgICAgICAgICB0aW1lTGltaXRzW2ldLAogICAgICAgICAgICAgICAgbm9uY2VzW2ldLAogICAgICAgICAgICAgICAgcnNbaV0sCiAgICAgICAgICAgICAgICBzc1tpXSwKICAgICAgICAgICAgICAgIHZzW2ldCiAgICAgICAgICAgICk7CgogICAgICAgICAgICB1c2VkTm9uY2VzW3NlbGxlcnNbaV1dW25vbmNlc1tpXV0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnYXRoZXJPZmZlcnMoCiAgICAgICAgYWRkcmVzc1tdIHNlbGxlcnMsCiAgICAgICAgSUVSQzIwVG9rZW5bXSBzZWxsVG9rZW5zLAogICAgICAgIHVpbnQyNTZbXSBzZWxsQW1vdW50cwogICAgKQogICAgICAgIGludGVybmFsCiAgICB7CiAgICAgICAgZm9yICh1aW50MjU2IGkgPSAwOyBpIDwgc2VsbGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0cmFuc2ZlcihzZWxsZXJzW2ldLCBvd25lciwgc2VsbFRva2Vuc1tpXSwgc2VsbEFtb3VudHNbaV0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXN0cmlidXRlT2ZmZXJzKAogICAgICAgIGFkZHJlc3NbXSBzZWxsZXJzLAogICAgICAgIElFUkMyMFRva2VuW10gcmVjZWl2ZVRva2VucywKICAgICAgICB1aW50MjU2W10gcmVjZWl2ZUFtb3VudHMKICAgICkKICAgICAgICBpbnRlcm5hbAogICAgewogICAgICAgIGZvciAodWludDI1NiBpID0gMDsgaSA8IHNlbGxlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdHJhbnNmZXIob3duZXIsIHNlbGxlcnNbaV0sIHJlY2VpdmVUb2tlbnNbaV0sIHJlY2VpdmVBbW91bnRzW2ldKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZXhlY3V0ZU9mZmVycygKICAgICAgICBhZGRyZXNzW10gc2VsbGVycywKICAgICAgICBJRVJDMjBUb2tlbltdIHNlbGxUb2tlbnMsCiAgICAgICAgdWludDI1NltdIHNlbGxBbW91bnRzLAogICAgICAgIElFUkMyMFRva2VuW10gcmVjZWl2ZVRva2VucywKICAgICAgICB1aW50MjU2W10gcmVjZWl2ZUFtb3VudHMsCiAgICAgICAgdWludDI1NltdIHRpbWVMaW1pdHMsCiAgICAgICAgdWludDI1NltdIG5vbmNlcywKICAgICAgICBieXRlczMyW10gcnMsCiAgICAgICAgYnl0ZXMzMltdIHNzLAogICAgICAgIHVpbnQ4W10gdnMKICAgICkKICAgICAgICBwdWJsaWMKICAgIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIsICJPbmx5IHRoZSBvd25lciBjYW4gZXhlY3V0ZSBvZmZlcnMuIik7CgogICAgICAgIGFjY2VwdE9mZmVycygKICAgICAgICAgICAgc2VsbGVycywKICAgICAgICAgICAgc2VsbFRva2VucywKICAgICAgICAgICAgc2VsbEFtb3VudHMsCiAgICAgICAgICAgIHJlY2VpdmVUb2tlbnMsCiAgICAgICAgICAgIHJlY2VpdmVBbW91bnRzLAogICAgICAgICAgICB0aW1lTGltaXRzLAogICAgICAgICAgICBub25jZXMsCiAgICAgICAgICAgIHJzLAogICAgICAgICAgICBzcywKICAgICAgICAgICAgdnMKICAgICAgICApOwogICAgICAgIGdhdGhlck9mZmVycyhzZWxsZXJzLCBzZWxsVG9rZW5zLCBzZWxsQW1vdW50cyk7CiAgICAgICAgZGlzdHJpYnV0ZU9mZmVycyhzZWxsZXJzLCByZWNlaXZlVG9rZW5zLCByZWNlaXZlQW1vdW50cyk7CiAgICB9Cn0K&#34; download=&#39;clearinghouse.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;signature.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;escrow.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Clearinghouse&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Escrow&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Signature&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Escrow&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;validateOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Offer has expired.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Duplicate nonce.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
                &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Invalid signature.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;executeOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only the owner can execute offers.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;validateOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;timeLimit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;acceptOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;validateOffer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

            &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;gatherOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;distributeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;executeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only the owner can execute offers.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;acceptOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;timeLimits&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;nonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;rs&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;vs&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;gatherOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sellAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;distributeOffers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sellers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receiveAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;signature.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7Cgpjb250cmFjdCBTaWduYXR1cmUgeyAgICAKICAgIGZ1bmN0aW9uIHNwbGl0U2lnbmF0dXJlKGJ5dGVzIHNpZykKICAgIGludGVybmFsCiAgICBwdXJlCiAgICByZXR1cm5zICh1aW50OCwgYnl0ZXMzMiwgYnl0ZXMzMikKICAgIHsKICAgICAgICByZXF1aXJlKHNpZy5sZW5ndGggPT0gNjUpOwoKICAgICAgICBieXRlczMyIHI7CiAgICAgICAgYnl0ZXMzMiBzOwogICAgICAgIHVpbnQ4IHY7CgogICAgICAgIGFzc2VtYmx5IHsKICAgICAgICAgICAgLy8gZmlyc3QgMzIgYnl0ZXMsIGFmdGVyIHRoZSBsZW5ndGggcHJlZml4CiAgICAgICAgICAgIHIgOj0gbWxvYWQoYWRkKHNpZywgMzIpKQogICAgICAgICAgICAvLyBzZWNvbmQgMzIgYnl0ZXMKICAgICAgICAgICAgcyA6PSBtbG9hZChhZGQoc2lnLCA2NCkpCiAgICAgICAgICAgIC8vIGZpbmFsIGJ5dGUgKGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgMzIgYnl0ZXMpCiAgICAgICAgICAgIHYgOj0gYnl0ZSgwLCBtbG9hZChhZGQoc2lnLCA5NikpKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICh2LCByLCBzKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWNvdmVyU2lnbmVyKGJ5dGVzMzIgbWVzc2FnZSwgYnl0ZXMgc2lnKQogICAgaW50ZXJuYWwKICAgIHB1cmUKICAgIHJldHVybnMgKGFkZHJlc3MpCiAgICB7CiAgICAgICAgdWludDggdjsKICAgICAgICBieXRlczMyIHI7CiAgICAgICAgYnl0ZXMzMiBzOwoKICAgICAgICAodiwgciwgcykgPSBzcGxpdFNpZ25hdHVyZShzaWcpOwoKICAgICAgICByZXR1cm4gZWNyZWNvdmVyKG1lc3NhZ2UsIHYsIHIsIHMpOwogICAgfQoKICAgIC8vIEJ1aWxkcyBhIHByZWZpeGVkIGhhc2ggdG8gbWltaWMgdGhlIGJlaGF2aW9yIG9mIGV0aF9zaWduLgogICAgZnVuY3Rpb24gcHJlZml4ZWQoYnl0ZXMzMiBoYXNoKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKGJ5dGVzMzIpIHsKICAgICAgICByZXR1cm4ga2VjY2FrMjU2KGFiaS5lbmNvZGVQYWNrZWQoCiAgICAgICAgICAgICJceDE5RXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6XG4zMiIsIGhhc2gpKTsKICAgIH0KfQo=&#34; download=&#39;signature.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Signature&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;    
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;abi&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;encodePacked&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Storage Patterns: Set</title>
      <link>https://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/</link>
      <pubDate>Sun, 03 Jun 2018 07:14:02 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll build a minimal enumerable &lt;a href=&#34;https://en.wikipedia.org/wiki/Set_(abstract_data_type)&#34;&gt;set&lt;/a&gt; in Solidity. A set stores unordered values without repetition.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;set-functionality&#34;&gt;Set Functionality&lt;/h2&gt;

&lt;p&gt;The implementation in this post will support the following primitive set operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; a value to the set.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove&lt;/strong&gt; a value from the set.&lt;/li&gt;
&lt;li&gt;Test whether the set &lt;strong&gt;contains&lt;/strong&gt; a given value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enumerate&lt;/strong&gt; all values in the set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many implementations additionally implement set-theoretical operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find the &lt;strong&gt;union&lt;/strong&gt; of two sets.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;intersection&lt;/strong&gt; of two sets.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;difference&lt;/strong&gt; between two sets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I won&amp;rsquo;t write those higher level functions here, but note that they can be easily implemented using the primitive operations.&lt;/p&gt;

&lt;h2 id=&#34;combining-data-structures&#34;&gt;Combining Data Structures&lt;/h2&gt;

&lt;p&gt;A mapping from value types to booleans provides much of a set&amp;rsquo;s functionality. It efficiently supports adding and removing items as well as testing for membership. What it &lt;em&gt;doesn&amp;rsquo;t&lt;/em&gt; support is enumeration.&lt;/p&gt;

&lt;p&gt;An array works well for enumeration, but it doesn&amp;rsquo;t support efficiently finding an existing item.&lt;/p&gt;

&lt;p&gt;To support all the primitive operations efficiently, I will combine the two data structures. In this example code, I&amp;rsquo;ve chosen &lt;code&gt;bytes32&lt;/code&gt; as the data type being stored in the set, but the pattern generalizes to any data type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 1-based indexing into the array. 0 represents non-existence.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;items&lt;/code&gt; array is where the values are stored, in no particular order. This allows for efficient enumeration.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;indexOf&lt;/code&gt; mapping keeps track of which values are contained within the set and where they can be found in the &lt;code&gt;items&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;In Solidity, &lt;code&gt;mapping&lt;/code&gt;s do not have a notion of existence. Every key maps to something, and the default value is &lt;code&gt;0&lt;/code&gt;. This is a bit of a problem, because &lt;code&gt;0&lt;/code&gt; is also the first index into the &lt;code&gt;items&lt;/code&gt; array. To resolve this ambiguity, &lt;code&gt;indexOf&lt;/code&gt; will hold &lt;em&gt;1-based&lt;/em&gt; indexes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;indexOf[value] == 0&lt;/code&gt;, then the value does not exist in the set.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;indexOf[value] == n&lt;/code&gt;, where &lt;code&gt;n &amp;gt; 0&lt;/code&gt;, then &lt;code&gt;items[n - 1] == value&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;adding-items&#34;&gt;Adding Items&lt;/h2&gt;

&lt;p&gt;To add an item to the set, it must be appended to the &lt;code&gt;items&lt;/code&gt; array, and it&amp;rsquo;s new (1-based) index must be stored in &lt;code&gt;indexOf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Recall that sets do not allow repeated elements. The &lt;code&gt;if&lt;/code&gt; statement ensures that an item is not added multiple times.&lt;/p&gt;

&lt;h2 id=&#34;testing-for-membership&#34;&gt;Testing for Membership&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;indexOf&lt;/code&gt; mapping makes it easy to efficiently test for set membership:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;contains&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;removing-items&#34;&gt;Removing Items&lt;/h2&gt;

&lt;p&gt;Removing an item involves updating both the &lt;code&gt;indexOf&lt;/code&gt; mapping and the &lt;code&gt;items&lt;/code&gt; array. Updating the mapping is straightforward, but it&amp;rsquo;s less obvious how an item can be efficiently deleted from the middle of an array.&lt;/p&gt;

&lt;p&gt;The key to implementing this operation efficiently is to recall that items in a set are &lt;em&gt;unordered&lt;/em&gt;. Because we don&amp;rsquo;t need to preserve order, we can shuffle items around to make our lives easier. To remove the item from the array, we first swap it to the end of the array and then shrink the array:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remove&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// move the last item into the index being vacated&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// adjust for 1-based indexing&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;enumeration&#34;&gt;Enumeration&lt;/h2&gt;

&lt;p&gt;Because it&amp;rsquo;s a &lt;code&gt;public&lt;/code&gt; state variable, the Solidity compiler generates a &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/&#34;&gt;getter&lt;/a&gt; for the &lt;code&gt;items&lt;/code&gt; array. A client can call &lt;code&gt;items(n)&lt;/code&gt; to retrieve the &lt;em&gt;n&lt;/em&gt;&lt;sup&gt;th&lt;/sup&gt; item from the array.&lt;/p&gt;

&lt;p&gt;To enumerate the entire list, the client also needs to know how many items there are. The &lt;code&gt;count()&lt;/code&gt; function provides this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A set stores values, unordered and without repetition.&lt;/li&gt;
&lt;li&gt;An enumerable set can be efficiently implemented with a mapping and an array.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;set.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7Cgpjb250cmFjdCBTZXQgewogICAgYnl0ZXMzMltdIHB1YmxpYyBpdGVtczsKCiAgICAvLyAxLWJhc2VkIGluZGV4aW5nIGludG8gdGhlIGFycmF5LiAwIHJlcHJlc2VudHMgbm9uLWV4aXN0ZW5jZS4KICAgIG1hcHBpbmcoYnl0ZXMzMiA9PiB1aW50MjU2KSBpbmRleE9mOwoKICAgIGZ1bmN0aW9uIGFkZChieXRlczMyIHZhbHVlKSBwdWJsaWMgewogICAgICAgIGlmIChpbmRleE9mW3ZhbHVlXSA9PSAwKSB7CiAgICAgICAgICAgIGl0ZW1zLnB1c2godmFsdWUpOwogICAgICAgICAgICBpbmRleE9mW3ZhbHVlXSA9IGl0ZW1zLmxlbmd0aDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlKGJ5dGVzMzIgdmFsdWUpIHB1YmxpYyB7CiAgICAgICAgdWludDI1NiBpbmRleCA9IGluZGV4T2ZbdmFsdWVdOwoKICAgICAgICByZXF1aXJlKGluZGV4ID4gMCk7CgogICAgICAgIC8vIG1vdmUgdGhlIGxhc3QgaXRlbSBpbnRvIHRoZSBpbmRleCBiZWluZyB2YWNhdGVkCiAgICAgICAgYnl0ZXMzMiBsYXN0VmFsdWUgPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTsKICAgICAgICBpdGVtc1tpbmRleCAtIDFdID0gbGFzdFZhbHVlOyAgLy8gYWRqdXN0IGZvciAxLWJhc2VkIGluZGV4aW5nCiAgICAgICAgaW5kZXhPZltsYXN0VmFsdWVdID0gaW5kZXg7CgogICAgICAgIGl0ZW1zLmxlbmd0aCAtPSAxOwogICAgICAgIGluZGV4T2ZbdmFsdWVdID0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250YWlucyhieXRlczMyIHZhbHVlKSBwdWJsaWMgdmlldyByZXR1cm5zIChib29sKSB7CiAgICAgICAgcmV0dXJuIGluZGV4T2ZbdmFsdWVdID4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3VudCgpIHB1YmxpYyB2aWV3IHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoOwogICAgfQp9Cg==&#34; download=&#39;set.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Set&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 1-based indexing into the array. 0 represents non-existence.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remove&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// move the last item into the index being vacated&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// adjust for 1-based indexing&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lastValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;contains&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;indexOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;items&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Escrowing ERC20 Tokens</title>
      <link>https://programtheblockchain.com/posts/2018/05/30/escrowing-erc20-tokens/</link>
      <pubDate>Wed, 30 May 2018 08:56:35 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/30/escrowing-erc20-tokens/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-06-05&lt;/strong&gt;] &lt;em&gt;This post has been edited to introduce a &lt;code&gt;transfer&lt;/code&gt; function.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post describes a simple contract to escrow ERC20 tokens for a period of time.  Keeping tokens (or ether) in escrow is a common pattern in smart contracts.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Escrow is particularly important for off-chain components that work with signed messages. Such a component often needs certainty that a token transfer promised via a signature can be fulfilled.&lt;/p&gt;

&lt;p&gt;A simple procedure for escrowing tokens is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An account approves a token transfer to the trusted smart contract.&lt;/li&gt;
&lt;li&gt;The smart contract transfers those tokens to itself, holding them in escrow.&lt;/li&gt;
&lt;li&gt;An account cannot withdraw escrowed tokens without first signaling the desire to end escrow.&lt;/li&gt;
&lt;li&gt;The escrow period ends a fixed amount of time after the signal to end escrow.&lt;/li&gt;
&lt;li&gt;Once the escrow period ends, the account may withdraw any remaining tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern above was exploited in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;payment channel post&lt;/a&gt;, for instance, where ether was kept in escrow rather than ERC20 tokens.&lt;/p&gt;

&lt;h2 id=&#34;cancellation-period&#34;&gt;Cancellation Period&lt;/h2&gt;

&lt;p&gt;This contract is parameterized with the escrow duration. When an account wishes to withdraw its tokens, this is how long it must wait before the withdrawal is allowed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Escrow&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowTime&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;tracking-per-token-balances-and-expirations&#34;&gt;Tracking Per-Token Balances and Expirations&lt;/h2&gt;

&lt;p&gt;To make the escrow fully general, the contract does not assume a specific ERC20 token, so a single account may escrow different tokens at the same time.  For each (account, token) pair, the contract tracks its balance and the time when escrow expires:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;deposit&#34;&gt;Deposit&lt;/h2&gt;

&lt;p&gt;Depositing tokens works with the familiar &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;ERC20&lt;/a&gt; pattern of &lt;code&gt;approve()&lt;/code&gt;/&lt;code&gt;transferFrom()&lt;/code&gt;. Once the depositor has approved the transfer, they can call &lt;code&gt;deposit()&lt;/code&gt; to move the tokens into the escrow contract. The escrow expiration time is initialized to the maximum allowed time, making it effectively infinite.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;withdrawal&#34;&gt;Withdrawal&lt;/h2&gt;

&lt;p&gt;Withdrawing tokens is a two-step process. First, the withdrawal is started. This sets the &lt;code&gt;escrowExpiration&lt;/code&gt; time to &lt;code&gt;escrowTime&lt;/code&gt; in the future and emits an event announcing the updating expiration time:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartWithdrawal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;time&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startWithdrawal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartWithdrawal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After the escrow time has expired, all of the (remaining) escrowed tokens can be transferred back to their original owner:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
        &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Funds still in escrow.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;transferring-tokens&#34;&gt;Transferring Tokens&lt;/h2&gt;

&lt;p&gt;Contracts require escrowed tokens to assure the ability to transfer those tokens.  Therefore, the contract supports a &lt;code&gt;transfer&lt;/code&gt; function that enables transferring tokens between accounts.  This routine would only be called by a subcontract of &lt;code&gt;Escrow&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient balance.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;escrowing-ether&#34;&gt;Escrowing Ether&lt;/h2&gt;

&lt;p&gt;This contract supports escrowing any ERC20 tokens, but it does not directly help escrow ether.  One can, however,
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-token/&#34;&gt;wrap ether in an ERC20 token&lt;/a&gt;
to effectively escrow ether with this contract.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Escrow is a common pattern in smart contracts, especially those with off-chain components.&lt;/li&gt;
&lt;li&gt;This contract can escrow any tokens of all ERC20 types for any account.&lt;/li&gt;
&lt;li&gt;This contract doesn&amp;rsquo;t do anything other than escrow tokens&amp;mdash;its value is in being incorporated in a contract that needs escrow functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;escrow.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IEVzY3JvdyB7CiAgICB1aW50MjU2IHB1YmxpYyBlc2Nyb3dUaW1lOwoKICAgIGNvbnN0cnVjdG9yKHVpbnQyNTYgX2VzY3Jvd1RpbWUpIHB1YmxpYyB7CiAgICAgICAgZXNjcm93VGltZSA9IF9lc2Nyb3dUaW1lOwogICAgfQoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiBtYXBwaW5nKGFkZHJlc3MgPT4gdWludDI1NikpIHB1YmxpYyBlc2Nyb3dCYWxhbmNlOwogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSkgcHVibGljIGVzY3Jvd0V4cGlyYXRpb247CgogICAgZnVuY3Rpb24gZGVwb3NpdChJRVJDMjBUb2tlbiB0b2tlbiwgdWludDI1NiBhbW91bnQpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZSh0b2tlbi50cmFuc2ZlckZyb20obXNnLnNlbmRlciwgdGhpcywgYW1vdW50KSk7CiAgICAgICAgZXNjcm93QmFsYW5jZVttc2cuc2VuZGVyXVt0b2tlbl0gKz0gYW1vdW50OwogICAgICAgIGVzY3Jvd0V4cGlyYXRpb25bbXNnLnNlbmRlcl1bdG9rZW5dID0gMioqMjU2LTE7CiAgICB9CgogICAgZXZlbnQgU3RhcnRXaXRoZHJhd2FsKGFkZHJlc3MgaW5kZXhlZCBhY2NvdW50LCBhZGRyZXNzIHRva2VuLCB1aW50MjU2IHRpbWUpOwoKICAgIGZ1bmN0aW9uIHN0YXJ0V2l0aGRyYXdhbChJRVJDMjBUb2tlbiB0b2tlbikgcHVibGljIHsKICAgICAgICB1aW50MjU2IGV4cGlyYXRpb24gPSBub3cgKyBlc2Nyb3dUaW1lOwogICAgICAgIGVzY3Jvd0V4cGlyYXRpb25bbXNnLnNlbmRlcl1bdG9rZW5dID0gZXhwaXJhdGlvbjsKICAgICAgICBlbWl0IFN0YXJ0V2l0aGRyYXdhbChtc2cuc2VuZGVyLCB0b2tlbiwgZXhwaXJhdGlvbik7CiAgICB9CgogICAgZnVuY3Rpb24gd2l0aGRyYXcoSUVSQzIwVG9rZW4gdG9rZW4pIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShub3cgPiBlc2Nyb3dFeHBpcmF0aW9uW21zZy5zZW5kZXJdW3Rva2VuXSwKICAgICAgICAgICAgIkZ1bmRzIHN0aWxsIGluIGVzY3Jvdy4iKTsKCiAgICAgICAgdWludDI1NiBhbW91bnQgPSBlc2Nyb3dCYWxhbmNlW21zZy5zZW5kZXJdW3Rva2VuXTsKICAgICAgICBlc2Nyb3dCYWxhbmNlW21zZy5zZW5kZXJdW3Rva2VuXSA9IDA7CiAgICAgICAgcmVxdWlyZSh0b2tlbi50cmFuc2Zlcihtc2cuc2VuZGVyLCBhbW91bnQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2ZlcigKICAgICAgICBhZGRyZXNzIGZyb20sCiAgICAgICAgYWRkcmVzcyB0bywKICAgICAgICBJRVJDMjBUb2tlbiB0b2tlbiwKICAgICAgICB1aW50MjU2IHRva2VucwogICAgKQogICAgICAgIGludGVybmFsCiAgICB7CiAgICAgICAgcmVxdWlyZShlc2Nyb3dCYWxhbmNlW2Zyb21dW3Rva2VuXSA&amp;#43;PSB0b2tlbnMsICJJbnN1ZmZpY2llbnQgYmFsYW5jZS4iKTsKCiAgICAgICAgZXNjcm93QmFsYW5jZVtmcm9tXVt0b2tlbl0gLT0gdG9rZW5zOwogICAgICAgIGVzY3Jvd0JhbGFuY2VbdG9dW3Rva2VuXSArPSB0b2tlbnM7CiAgICB9Cn0K&#34; download=&#39;escrow.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Escrow&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowTime&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartWithdrawal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;time&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startWithdrawal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartWithdrawal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Funds still in escrow.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient balance.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;escrowBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Wrapping Ether in an ERC20 Token</title>
      <link>https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-token/</link>
      <pubDate>Sat, 26 May 2018 07:58:51 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-token/</guid>
      <description>&lt;p&gt;In this short post, I&amp;rsquo;ll show how ether can be &amp;ldquo;wrapped&amp;rdquo; in an ERC20-compatible token. This means ether can be used anywhere that an ERC20 token is expected.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;why-wrap-ether&#34;&gt;Why Wrap Ether?&lt;/h2&gt;

&lt;p&gt;Ether is the native currency of Ethereum. It predates ERC20 and other token standards, so it doesn&amp;rsquo;t have the same interface. This can be the source of complexity in smart contracts. If a smart contract is to accept all types of currency, it must implement two interfaces: one for ether and one for ERC20 tokens.&lt;/p&gt;

&lt;p&gt;&amp;ldquo;Wrapping&amp;rdquo; ether solves this problem by introducing a layer of indirection. Users can purchase ERC20-compatible &amp;ldquo;ether tokens&amp;rdquo; for native ether, at a 1:1 exchange rate. Then they can use those tokens with any smart contract that understands ERC20. Finally, the tokens can be exchanged back for ether, again at a 1:1 exchange rate.&lt;/p&gt;

&lt;p&gt;The term &amp;ldquo;wrapping&amp;rdquo; comes from a token called &lt;a href=&#34;https://weth.io/&#34;&gt;W-ETH&lt;/a&gt;. That implementation is very similar to the contract presented in this post.&lt;/p&gt;

&lt;h2 id=&#34;ethertoken&#34;&gt;EtherToken&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;EtherToken&lt;/code&gt; inherits from &lt;code&gt;BaseERC20Token&lt;/code&gt;, which can be found in our post on &lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/16/changing-the-supply-of-erc20-tokens/&#34;&gt;changing the total supply of ERC20 tokens&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The number of &lt;code&gt;decimals&lt;/code&gt; is fixed at 18 to match ether. (One ether is 10&lt;sup&gt;18&lt;/sup&gt; wei.) The &lt;code&gt;totalSupply&lt;/code&gt; begins at 0. This will be increased when users buy tokens for ether.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;baseerc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EtherToken&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;buying-tokens&#34;&gt;Buying Tokens&lt;/h2&gt;

&lt;p&gt;Tokens can be purchased for ether at a 1:1 exchange rate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The purchaser&amp;rsquo;s balance is increased, as is the total supply of tokens. Like in our &lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/16/changing-the-supply-of-erc20-tokens/&#34;&gt;&lt;code&gt;MintableToken&lt;/code&gt; contract&lt;/a&gt;, a &lt;code&gt;Transfer&lt;/code&gt; event from address &lt;code&gt;0&lt;/code&gt; indicates that new tokens were created.&lt;/p&gt;

&lt;h2 id=&#34;selling-tokens&#34;&gt;Selling Tokens&lt;/h2&gt;

&lt;p&gt;Tokens can be sold back to the contract in exchange for ether, again at a 1:1 rate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient balance.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;Transfer&lt;/code&gt; event to address &lt;code&gt;0x0&lt;/code&gt; indicates that tokens were destroyed.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Wrapping ether in an ERC20 token is convenient for handling both ether and ERC20 tokens in the same contract.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weth.io/&#34;&gt;W-ETH&lt;/a&gt; is an existing implementation that you can use.&lt;/li&gt;
&lt;li&gt;Building such a token yourself requires only adding &lt;code&gt;buy()&lt;/code&gt; and &lt;code&gt;sell()&lt;/code&gt; functions to a typical ERC20 token implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;ethertoken.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjQ7CgppbXBvcnQgImJhc2VlcmMyMHRva2VuLnNvbCI7Cgpjb250cmFjdCBFdGhlclRva2VuIGlzIEJhc2VFUkMyMFRva2VuIHsKICAgIGNvbnN0cnVjdG9yKHN0cmluZyBfbmFtZSwgc3RyaW5nIF9zeW1ib2wpCiAgICAgICAgQmFzZUVSQzIwVG9rZW4oMCwgMTgsIF9uYW1lLCBfc3ltYm9sKSBwdWJsaWMKICAgIHsKICAgIH0KCiAgICBmdW5jdGlvbiBidXkoKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdICs9IG1zZy52YWx1ZTsKICAgICAgICB0b3RhbFN1cHBseSArPSBtc2cudmFsdWU7CgogICAgICAgIGVtaXQgVHJhbnNmZXIoYWRkcmVzcygwKSwgbXNnLnNlbmRlciwgbXNnLnZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxsKHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoYmFsYW5jZU9mW21zZy5zZW5kZXJdID49IGFtb3VudCwgIkluc3VmZmljaWVudCBiYWxhbmNlLiIpOwoKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gLT0gYW1vdW50OwogICAgICAgIHRvdGFsU3VwcGx5IC09IGFtb3VudDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CgogICAgICAgIGVtaXQgVHJhbnNmZXIobXNnLnNlbmRlciwgYWRkcmVzcygwKSwgYW1vdW50KTsKICAgIH0KfQo=&#34; download=&#39;ethertoken.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;baseerc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EtherToken&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sell&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Insufficient balance.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Prediction Market Contract</title>
      <link>https://programtheblockchain.com/posts/2018/05/22/writing-a-prediction-market-contract/</link>
      <pubDate>Tue, 22 May 2018 05:33:00 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/22/writing-a-prediction-market-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a smart contract that implements a prediction market.  The contract will leverage much of the logic in my
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/18/using-tokens-for-parimutuel-wagers/&#34;&gt;token-based parimutuel betting contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;token-based-design&#34;&gt;Token-Based Design&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&#34;https://en.wikipedia.org/wiki/Prediction_market&#34;&gt;prediction market&lt;/a&gt; is a way to bet on a future event by creating &amp;ldquo;contingent securities&amp;rdquo; that represent the possible outcomes.  Once the outcome is determined, shares of the correct security have a predetermined value and the rest of the securities are worthless.  An example will help.&lt;/p&gt;

&lt;p&gt;A prediction market could be set up to forecast which NFL football team will win the Super Bowl.  For this, there would be be 32 different securities, with each NFL team associated with shares of its own security.  Bettors would buy and sell shares of these securities knowing that only the shares of a single security will have value.  For all of my examples, I will assume that a winning share is worth 1 ETH.&lt;/p&gt;

&lt;p&gt;The simplest prediction markets rely on three ideas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bettors can buy a &amp;ldquo;bundle&amp;rdquo; that consists of an equal number of shares of &lt;em&gt;every&lt;/em&gt; security.  If a winning share is worth 1 ETH, then a bundle containing one share of every security costs 1 ETH.  Note that this exchange is perfect in the sense that the prediction market collects 1 ETH per bundle and will ultimately owe exactly 1 ETH for the share of the winning security/outcome.&lt;/li&gt;
&lt;li&gt;Bettors can buy and sell individual shares at mutually agreed upon prices.&lt;/li&gt;
&lt;li&gt;Once the outcome is known, bettors can redeem winning shares for 1 ETH.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;similarities-to-token-based-parimutuel-wagering&#34;&gt;Similarities to Token-Based Parimutuel Wagering&lt;/h2&gt;

&lt;p&gt;Prediction markets and parimutuel wagering have a lot in common and only a few differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both are parameterized by the same values: a proposition and a number of possible outcomes.&lt;/li&gt;
&lt;li&gt;Both can be in the same &lt;code&gt;Open&lt;/code&gt;, &lt;code&gt;Closed&lt;/code&gt;, &lt;code&gt;Resolved&lt;/code&gt; or &lt;code&gt;Cancelled&lt;/code&gt; states.&lt;/li&gt;
&lt;li&gt;Both can have outcomes represented by ERC20 tokens.&lt;/li&gt;
&lt;li&gt;Both ultimately reward only one token.&lt;/li&gt;
&lt;li&gt;In parimutuel betting, outcome tokens are bought individually from the contract.  In prediction markets, complete bundles are bought from the contract.&lt;/li&gt;
&lt;li&gt;In parimutuel betting, payoffs have a modestly complex computation based on proportional ownership of tokens.  In prediction markets, the payoff is 1:1 (ether to tokens).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, everything from the token-based parimutuel post can be reused for a prediction market contract except for the routines that handle ether: &lt;code&gt;bet&lt;/code&gt;, &lt;code&gt;claim&lt;/code&gt;, and &lt;code&gt;refund&lt;/code&gt;.  I have put all the common code in a base contract called &lt;code&gt;WagerBase&lt;/code&gt;, which is included at the end of this post.  I will describe the new ether-handling routines for a prediction market fully.&lt;/p&gt;

&lt;h2 id=&#34;buying-bundles&#34;&gt;Buying Bundles&lt;/h2&gt;

&lt;p&gt;Bettors buy complete bundles, 1:1 for the ether provided:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that &lt;code&gt;buyBundle&lt;/code&gt; does not need to be limited to the &lt;code&gt;Open&lt;/code&gt; state.  This is because every outcome is being purchased, and the winning token will only pay 1:1, so there&amp;rsquo;s no way to gain an advantage by buying late.&lt;/p&gt;

&lt;h2 id=&#34;refunding-bundles&#34;&gt;Refunding Bundles&lt;/h2&gt;

&lt;p&gt;Bettors can also sell complete bundles back to the contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that &lt;code&gt;refundBundle&lt;/code&gt; is also not limited to any particular contract state (e.g., &lt;code&gt;Open&lt;/code&gt;, &lt;code&gt;Closed&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;p&gt;The ability to refund complete bundles is helpful to bettors who might bet on different outcomes as the prices of the underlying tokens change.  In the process of doing that, they might find themselves with complete bundles and not want to wait until the market is resolved to cash in on those complete bundles.&lt;/p&gt;

&lt;h2 id=&#34;claiming-winnings&#34;&gt;Claiming Winnings&lt;/h2&gt;

&lt;p&gt;After the proposition has been resolved, winning tokens can be redeemed 1:1 for ether:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;cancellations&#34;&gt;Cancellations&lt;/h2&gt;

&lt;p&gt;If a prediction market is cancelled, participants should be able to get a refund for their purchased tokens. A complete bundle always has a clear value, but what about individual tokens that aren&amp;rsquo;t part of a bundle? I see three options for how to handle this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t do anything special&lt;/strong&gt;.  Complete bundles can already be refunded. Bettors can always cooperate to create complete bundles that can be refunded, and they will have an incentive to do so.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refund proportionally&lt;/strong&gt;.  A simple scheme would be to provide refunds based on an equal division.  If there are &lt;em&gt;N&lt;/em&gt; outcomes, then each token can be refunded for &lt;em&gt;1/N&lt;/em&gt; ETH.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Designate a Cancellation Outcome&lt;/strong&gt;.  The contract creator could designate particular token as the &amp;ldquo;Cancellation Token&amp;rdquo; and resolve the contract in favor of that token.  This means that cancellation would simply be another outcome that bettors could choose to bet on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;rsquo;ve chosen to do nothing special. Bettors can still get refunds with a little cooperation, and this option is the easiest to implement correctly.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prediction markets can be implemented with ERC20 tokens.&lt;/li&gt;
&lt;li&gt;Prediction markets and
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/18/using-tokens-for-parimutuel-wagers/&#34;&gt;token-based parimutuel wagering&lt;/a&gt;
are very similar and can share a great deal of code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contracts&#34;&gt;The Complete Contracts&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;prediction.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7CgppbXBvcnQgIndhZ2VyYmFzZS5zb2wiOwoKY29udHJhY3QgUHJlZGljdGlvbk1hcmtldCBpcyBXYWdlckJhc2UgewogICAgY29uc3RydWN0b3IoCiAgICAgICAgc3RyaW5nIF9wcm9wb3NpdGlvbiwKICAgICAgICBieXRlczMyW10gX291dGNvbWVzLAogICAgICAgIGJ5dGVzMzJbXSBfc3ltYm9scywKICAgICAgICB1aW50MjU2IHRpbWVvdXREZWxheQogICAgKQogICAgICAgIC8vIEp1c3QgZm9yd2FyZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgYmFzZSBjb25zdHJ1Y3Rvci4KICAgICAgICBXYWdlckJhc2UoX3Byb3Bvc2l0aW9uLCBfb3V0Y29tZXMsIF9zeW1ib2xzLCB0aW1lb3V0RGVsYXkpCiAgICAgICAgcHVibGljCiAgICB7CiAgICB9CgogICAgZnVuY3Rpb24gYnV5QnVuZGxlKCkgcHVibGljIHBheWFibGUgewogICAgICAgIGZvciAodWludDI1NiBpID0gMDsgaSA8IG91dGNvbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRva2Vuc1tpXS5taW50KG1zZy5zZW5kZXIsIG1zZy52YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlZnVuZEJ1bmRsZSh1aW50MjU2IGFtb3VudCkgcHVibGljIHsKICAgICAgICBmb3IgKHVpbnQyNTYgaSA9IDA7IGkgPCBvdXRjb21lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0b2tlbnNbaV0uYnVybkZyb20obXNnLnNlbmRlciwgYW1vdW50KTsKICAgICAgICB9CiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhbW91bnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYWltKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5SZXNvbHZlZCk7CgogICAgICAgIHVpbnQyNTYgYW1vdW50ID0gdG9rZW5zW3dpbm5pbmdPdXRjb21lXS5iYWxhbmNlT2YobXNnLnNlbmRlcik7CiAgICAgICAgdG9rZW5zW3dpbm5pbmdPdXRjb21lXS5idXJuRnJvbShtc2cuc2VuZGVyLCBhbW91bnQpOwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KfQo=&#34; download=&#39;prediction.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;wagerbase.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PredictionMarket&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Just forward the parameters to the base constructor.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refundBundle&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;wagerbase.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7CgppbXBvcnQgIm1pbnRhYmxldG9rZW4uc29sIjsKCmNvbnRyYWN0IFdhZ2VyQmFzZSB7CiAgICBhZGRyZXNzIHB1YmxpYyBvd25lcjsKCiAgICBzdHJpbmcgcHVibGljIHByb3Bvc2l0aW9uOwogICAgYnl0ZXMzMltdIHB1YmxpYyBvdXRjb21lczsKICAgIGJ5dGVzMzJbXSBwdWJsaWMgc3ltYm9sczsKICAgIHVpbnQyNTYgcHVibGljIHRpbWVvdXQ7CiAgICBNaW50YWJsZVRva2VuW10gcHVibGljIHRva2VuczsKCiAgICBjb25zdHJ1Y3RvcigKICAgICAgICBzdHJpbmcgX3Byb3Bvc2l0aW9uLAogICAgICAgIGJ5dGVzMzJbXSBfb3V0Y29tZXMsCiAgICAgICAgYnl0ZXMzMltdIF9zeW1ib2xzLAogICAgICAgIHVpbnQyNTYgdGltZW91dERlbGF5CiAgICApCiAgICAgICAgcHVibGljCiAgICB7CiAgICAgICAgb3duZXIgPSBtc2cuc2VuZGVyOwogICAgICAgIHByb3Bvc2l0aW9uID0gX3Byb3Bvc2l0aW9uOwogICAgICAgIG91dGNvbWVzID0gX291dGNvbWVzOwogICAgICAgIHN5bWJvbHMgPSBfc3ltYm9sczsKICAgICAgICB0aW1lb3V0ID0gbm93ICsgdGltZW91dERlbGF5OwoKICAgICAgICBmb3IgKHVpbnQyNTYgaSA9IDA7IGkgPCBfb3V0Y29tZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdG9rZW5zLnB1c2gobmV3IE1pbnRhYmxlVG9rZW4oMCwgMTgsIHRvU3RyaW5nKF9vdXRjb21lc1tpXSksCiAgICAgICAgICAgICAgICB0b1N0cmluZyhfc3ltYm9sc1tpXSkpKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9TdHJpbmcoYnl0ZXMzMiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHN0cmluZykgewogICAgICAgIC8vIENvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgYnl0ZXMzMiB0byBhIHN0cmluZy4KCiAgICAgICAgdWludDI1NiBsZW5ndGggPSAwOwogICAgICAgIHdoaWxlIChsZW5ndGggPCAzMiAmJiBiW2xlbmd0aF0gIT0gMCkgewogICAgICAgICAgICBsZW5ndGggKz0gMTsKICAgICAgICB9CgogICAgICAgIGJ5dGVzIG1lbW9yeSBieXRlc1N0cmluZyA9IG5ldyBieXRlcyhsZW5ndGgpOwogICAgICAgIGZvciAodWludDI1NiBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGJ5dGVzU3RyaW5nW2pdID0gYltqXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHJpbmcoYnl0ZXNTdHJpbmcpOwogICAgfQoKICAgIGVudW0gU3RhdGVzIHsgT3BlbiwgQ2xvc2VkLCBSZXNvbHZlZCwgQ2FuY2VsbGVkIH0KICAgIFN0YXRlcyBzdGF0ZSA9IFN0YXRlcy5PcGVuOwoKICAgIHVpbnQyNTYgd2lubmluZ091dGNvbWU7CgogICAgZnVuY3Rpb24gY2xvc2UoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoc3RhdGUgPT0gU3RhdGVzLk9wZW4pOwogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBvd25lcik7CgogICAgICAgIHN0YXRlID0gU3RhdGVzLkNsb3NlZDsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNvbHZlKHVpbnQyNTYgX3dpbm5pbmdPdXRjb21lKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoc3RhdGUgPT0gU3RhdGVzLkNsb3NlZCk7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IG93bmVyKTsKCiAgICAgICAgd2lubmluZ091dGNvbWUgPSBfd2lubmluZ091dGNvbWU7CiAgICAgICAgc3RhdGUgPSBTdGF0ZXMuUmVzb2x2ZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gY2FuY2VsKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlICE9IFN0YXRlcy5SZXNvbHZlZCk7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IG93bmVyIHx8IG5vdyA&amp;#43;IHRpbWVvdXQpOwoKICAgICAgICBzdGF0ZSA9IFN0YXRlcy5DYW5jZWxsZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gb3V0Y29tZUNvdW50KCkgcHVibGljIHZpZXcgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJldHVybiBvdXRjb21lcy5sZW5ndGg7CiAgICB9Cn0K&#34; download=&#39;wagerbase.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;mintabletoken.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;WagerBase&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;symbols&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]),&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])));&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Convert a null-terminated bytes32 to a string.&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;memory&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bytesString&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;bytesString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;bytesString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomeCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Using Tokens for Parimutuel Wagers</title>
      <link>https://programtheblockchain.com/posts/2018/05/18/using-tokens-for-parimutuel-wagers/</link>
      <pubDate>Fri, 18 May 2018 05:21:04 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/18/using-tokens-for-parimutuel-wagers/</guid>
      <description>&lt;p&gt;This post describes an alternative implementation of parimutuel wagering to
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/08/writing-a-parimutuel-wager-contract/&#34;&gt;my original post&lt;/a&gt;. This implementation will use ERC20 tokens to represent wagers.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;tokens-for-outcomes&#34;&gt;Tokens for Outcomes&lt;/h2&gt;

&lt;p&gt;The original contract used a &lt;code&gt;mapping&lt;/code&gt; to keep track of how much each account had wagered on each outcome.  The new contract will delegate that bookkeeping to
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/16/changing-the-supply-of-erc20-tokens/&#34;&gt;mintable ERC20 token contracts&lt;/a&gt;
that represent the outcomes.&lt;/p&gt;

&lt;p&gt;For each outcome, there will be a different token. To bet on an outcome, a bettor buys tokens representing that outcome from the parimutuel contract. These tokens are minted on demand. To claim their winnings once the bet is settled, a bettor sells tokens back to the parimutuel contract. These tokens are then burned.&lt;/p&gt;

&lt;h2 id=&#34;parameterization&#34;&gt;Parameterization&lt;/h2&gt;

&lt;p&gt;The token-based parimutuel contract is very similar to the original.  It&amp;rsquo;s parameterized in the same way, with descriptions of the proposition and outcomes.  The constructor also accepts an array of &amp;ldquo;symbols&amp;rdquo; that are used for ERC20 tokens.  The constructor&amp;rsquo;s significant difference is that it must deploy token contracts for each of the possible outcomes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenizedParimutuelContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;symbols&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]),&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])));&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;See the full source code at the end of the post for the implementation of &lt;code&gt;toString&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;betting&#34;&gt;Betting&lt;/h2&gt;

&lt;p&gt;Betting is nearly identical to the previous contract.  The difference is that wagers are tracked by minting tokens for the bettor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;128&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// avoid overflow possibility&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;claiming-winnings&#34;&gt;Claiming Winnings&lt;/h2&gt;

&lt;p&gt;Once a winning outcome has been declared, anyone can exchange winning tokens for ether.  First, the token holder must &lt;code&gt;approve&lt;/code&gt; a transfer of the tokens to the parimutuel contract.  Then the bettor can call &lt;code&gt;claim&lt;/code&gt; which burns the redeemed tokens so that they can never be redeemed again.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that we can be certain that the multiplication cannot overflow because of the limit on &lt;code&gt;total&lt;/code&gt; enforced in &lt;code&gt;bet&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;refunding-a-cancelled-bet&#34;&gt;Refunding a Cancelled Bet&lt;/h2&gt;

&lt;p&gt;If a bet is cancelled, token holders can claim a refund. Ether is returned and tokens are burned:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;other-functions&#34;&gt;Other Functions&lt;/h2&gt;

&lt;p&gt;The other functions of the original contract (&lt;code&gt;close&lt;/code&gt;, &lt;code&gt;resolve&lt;/code&gt;, and &lt;code&gt;cancel&lt;/code&gt;) are unchanged in this new contract.&lt;/p&gt;

&lt;h2 id=&#34;token-comparison&#34;&gt;Token Comparison&lt;/h2&gt;

&lt;p&gt;Using mintable ERC20 tokens provides one advantage over the previous contract&amp;mdash;it allows wagers to be bought and sold without any needed support from the parimutuel contract itself.  This is useful to people who would like to hedge their bets after the proposition has closed but before it has been resolved.&lt;/p&gt;

&lt;p&gt;This token-based implementation has one disadvantage compared to the original&amp;mdash;it limits the number of outcomes to the number of tokens that can be deployed by the constructor.  The original contract could conceivably have supported 2&lt;sup&gt;256&lt;/sup&gt;-1 different outcomes.  (To avoid running out of gas, the &lt;code&gt;outcomes&lt;/code&gt; array would have to be ignored.)&lt;/p&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;tokenizedparimutuel.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7CgppbXBvcnQgIm1pbnRhYmxldG9rZW4uc29sIjsKCmNvbnRyYWN0IFRva2VuaXplZFBhcmltdXR1ZWxDb250cmFjdCB7CiAgICBhZGRyZXNzIHB1YmxpYyBvd25lcjsKCiAgICBzdHJpbmcgcHVibGljIHByb3Bvc2l0aW9uOwogICAgYnl0ZXMzMltdIHB1YmxpYyBvdXRjb21lczsKICAgIGJ5dGVzMzJbXSBwdWJsaWMgc3ltYm9sczsKICAgIHVpbnQyNTYgcHVibGljIHRpbWVvdXQ7CiAgICBNaW50YWJsZVRva2VuW10gcHVibGljIHRva2VuczsKCiAgICBjb25zdHJ1Y3RvcigKICAgICAgICBzdHJpbmcgX3Byb3Bvc2l0aW9uLAogICAgICAgIGJ5dGVzMzJbXSBfb3V0Y29tZXMsCiAgICAgICAgYnl0ZXMzMltdIF9zeW1ib2xzLAogICAgICAgIHVpbnQyNTYgdGltZW91dERlbGF5CiAgICApCiAgICAgICAgcHVibGljCiAgICB7CiAgICAgICAgb3duZXIgPSBtc2cuc2VuZGVyOwogICAgICAgIHByb3Bvc2l0aW9uID0gX3Byb3Bvc2l0aW9uOwogICAgICAgIG91dGNvbWVzID0gX291dGNvbWVzOwogICAgICAgIHN5bWJvbHMgPSBfc3ltYm9sczsKICAgICAgICB0aW1lb3V0ID0gbm93ICsgdGltZW91dERlbGF5OwoKICAgICAgICBmb3IgKHVpbnQyNTYgaSA9IDA7IGkgPCBfb3V0Y29tZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdG9rZW5zLnB1c2gobmV3IE1pbnRhYmxlVG9rZW4oMCwgMTgsIHRvU3RyaW5nKF9vdXRjb21lc1tpXSksCiAgICAgICAgICAgICAgICB0b1N0cmluZyhfc3ltYm9sc1tpXSkpKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9TdHJpbmcoYnl0ZXMzMiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHN0cmluZykgewogICAgICAgIC8vIENvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgYnl0ZXMzMiB0byBhIHN0cmluZy4KCiAgICAgICAgdWludDI1NiBsZW5ndGggPSAwOwogICAgICAgIHdoaWxlIChsZW5ndGggPCAzMiAmJiBiW2xlbmd0aF0gIT0gMCkgewogICAgICAgICAgICBsZW5ndGggKz0gMTsKICAgICAgICB9CgogICAgICAgIGJ5dGVzIG1lbW9yeSBieXRlc1N0cmluZyA9IG5ldyBieXRlcyhsZW5ndGgpOwogICAgICAgIGZvciAodWludDI1NiBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGJ5dGVzU3RyaW5nW2pdID0gYltqXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHJpbmcoYnl0ZXNTdHJpbmcpOwogICAgfQoKICAgIGVudW0gU3RhdGVzIHsgT3BlbiwgQ2xvc2VkLCBSZXNvbHZlZCwgQ2FuY2VsbGVkIH0KICAgIFN0YXRlcyBzdGF0ZSA9IFN0YXRlcy5PcGVuOwoKICAgIG1hcHBpbmcodWludDI1NiA9PiB1aW50MjU2KSBwdWJsaWMgdG90YWxQZXJPdXRjb21lOwogICAgdWludDI1NiBwdWJsaWMgdG90YWw7CgogICAgdWludDI1NiB3aW5uaW5nT3V0Y29tZTsKCiAgICBmdW5jdGlvbiBiZXQodWludDI1NiBvdXRjb21lKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShzdGF0ZSA9PSBTdGF0ZXMuT3Blbik7CgogICAgICAgIHRva2Vuc1tvdXRjb21lXS5taW50KG1zZy5zZW5kZXIsIG1zZy52YWx1ZSk7CiAgICAgICAgdG90YWxQZXJPdXRjb21lW291dGNvbWVdICs9IG1zZy52YWx1ZTsKICAgICAgICB0b3RhbCArPSBtc2cudmFsdWU7CiAgICAgICAgcmVxdWlyZSh0b3RhbCA8IDIgKiogMTI4KTsgICAvLyBhdm9pZCBvdmVyZmxvdyBwb3NzaWJpbGl0eQogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5PcGVuKTsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIpOwoKICAgICAgICBzdGF0ZSA9IFN0YXRlcy5DbG9zZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzb2x2ZSh1aW50MjU2IF93aW5uaW5nT3V0Y29tZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5DbG9zZWQpOwogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBvd25lcik7CgogICAgICAgIHdpbm5pbmdPdXRjb21lID0gX3dpbm5pbmdPdXRjb21lOwogICAgICAgIHN0YXRlID0gU3RhdGVzLlJlc29sdmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYWltKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5SZXNvbHZlZCk7CgogICAgICAgIHVpbnQyNTYgYW1vdW50ID0gdG9rZW5zW3dpbm5pbmdPdXRjb21lXS5iYWxhbmNlT2YobXNnLnNlbmRlcik7CiAgICAgICAgdWludDI1NiB2YWx1ZSA9IGFtb3VudCAqIHRvdGFsIC8gdG90YWxQZXJPdXRjb21lW3dpbm5pbmdPdXRjb21lXTsKICAgICAgICB0b2tlbnNbd2lubmluZ091dGNvbWVdLmJ1cm5Gcm9tKG1zZy5zZW5kZXIsIGFtb3VudCk7CiAgICAgICAgbXNnLnNlbmRlci50cmFuc2Zlcih2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FuY2VsKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlICE9IFN0YXRlcy5SZXNvbHZlZCk7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IG93bmVyIHx8IG5vdyA&amp;#43;IHRpbWVvdXQpOwoKICAgICAgICBzdGF0ZSA9IFN0YXRlcy5DYW5jZWxsZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gcmVmdW5kKHVpbnQyNTYgb3V0Y29tZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5DYW5jZWxsZWQpOwoKICAgICAgICB1aW50MjU2IGFtb3VudCA9IHRva2Vuc1tvdXRjb21lXS5iYWxhbmNlT2YobXNnLnNlbmRlcik7CiAgICAgICAgdG9rZW5zW291dGNvbWVdLmJ1cm5Gcm9tKG1zZy5zZW5kZXIsIGFtb3VudCk7CiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhbW91bnQpOwogICAgfQp9Cg==&#34; download=&#39;tokenizedparimutuel.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;mintabletoken.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenizedParimutuelContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;symbols&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]),&lt;/span&gt;
                &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_symbols&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])));&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Convert a null-terminated bytes32 to a string.&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;memory&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bytesString&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;bytesString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;j&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;bytesString&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;128&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// avoid overflow possibility&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Changing the Supply of ERC20 Tokens</title>
      <link>https://programtheblockchain.com/posts/2018/05/16/changing-the-supply-of-erc20-tokens/</link>
      <pubDate>Wed, 16 May 2018 05:15:24 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/16/changing-the-supply-of-erc20-tokens/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-05-25&lt;/strong&gt;] &lt;em&gt;This post has been edited to introduce a &lt;code&gt;BaseERC20Token&lt;/code&gt; contract.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This short post will add dynamic control of the total supply of tokens to the previously introduced
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;simple ERC20 tokens&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Our previous ERC20 tokens made the simplifying assumption that the token&amp;rsquo;s total supply did not change. I&amp;rsquo;m going to relax that assumption in this post by allowing the owner to increase the token supply with a &amp;ldquo;mint&amp;rdquo; function.  Similarly, &amp;ldquo;burn&amp;rdquo; and &amp;ldquo;burnFrom&amp;rdquo; functions can decrease the total supply.&lt;/p&gt;

&lt;p&gt;Future posts will make use of the ability to dynamically create and destroy tokens.&lt;/p&gt;

&lt;h2 id=&#34;setting-the-initial-token-supply&#34;&gt;Setting the Initial Token Supply&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;MintableToken&lt;/code&gt; contract will inherit from a &lt;code&gt;BaseERC20Token&lt;/code&gt; contract and augment that with functions to mint and burn tokens. &lt;code&gt;BaseERC20Token&lt;/code&gt; is a fully parameterized version of the &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;&lt;code&gt;SimpleERC20Token&lt;/code&gt; contract&lt;/a&gt;. The full source code can be found at the end of this post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;baseerc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;minting-tokens&#34;&gt;Minting Tokens&lt;/h2&gt;

&lt;p&gt;The contract&amp;rsquo;s owner can create new tokens by calling &lt;code&gt;mint&lt;/code&gt;. This increases the total token supply and grants ownership of the new tokens to the specified recipient:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Overflow check&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;burning-tokens&#34;&gt;Burning Tokens&lt;/h2&gt;

&lt;p&gt;Anyone can destroy a portion or all of the tokens they own by calling &lt;code&gt;burn&lt;/code&gt;. The specified amount is removed not only from the caller&amp;rsquo;s token balance but also from the token&amp;rsquo;s total supply:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;burn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By convention, burning tokens emits a &lt;code&gt;Transfer&lt;/code&gt; event with the address &lt;code&gt;0x0&lt;/code&gt; as the recipient.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s often useful to be able to burn tokens on behalf of another account. The &lt;code&gt;burnFrom&lt;/code&gt; function borrows logic from ERC20&amp;rsquo;s &lt;code&gt;transferFrom&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This contract supports dynamic changes to the total supply of tokens.&lt;/li&gt;
&lt;li&gt;This contract exploits inheritance to extend the &lt;code&gt;BaseERC20Token&lt;/code&gt; contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;baseerc20token.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-down pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7Cgpjb250cmFjdCBCYXNlRVJDMjBUb2tlbiB7CiAgICBtYXBwaW5nIChhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpIHB1YmxpYyBiYWxhbmNlT2Y7CgogICAgc3RyaW5nIHB1YmxpYyBuYW1lOwogICAgc3RyaW5nIHB1YmxpYyBzeW1ib2w7CiAgICB1aW50OCBwdWJsaWMgZGVjaW1hbHM7CiAgICB1aW50MjU2IHB1YmxpYyB0b3RhbFN1cHBseTsKCiAgICBldmVudCBUcmFuc2ZlcihhZGRyZXNzIGluZGV4ZWQgZnJvbSwgYWRkcmVzcyBpbmRleGVkIHRvLCB1aW50MjU2IHZhbHVlKTsKCiAgICBjb25zdHJ1Y3RvciAoCiAgICAgICAgdWludDI1NiBfdG90YWxTdXBwbHksCiAgICAgICAgdWludDggX2RlY2ltYWxzLAogICAgICAgIHN0cmluZyBfbmFtZSwKICAgICAgICBzdHJpbmcgX3N5bWJvbAogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIG5hbWUgPSBfbmFtZTsKICAgICAgICBzeW1ib2wgPSBfc3ltYm9sOwogICAgICAgIGRlY2ltYWxzID0gX2RlY2ltYWxzOwoKICAgICAgICB0b3RhbFN1cHBseSA9IF90b3RhbFN1cHBseTsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPSBfdG90YWxTdXBwbHk7CiAgICAgICAgZW1pdCBUcmFuc2ZlcihhZGRyZXNzKDApLCBtc2cuc2VuZGVyLCBfdG90YWxTdXBwbHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyKGFkZHJlc3MgdG8sIHVpbnQyNTYgdmFsdWUpIHB1YmxpYyByZXR1cm5zIChib29sIHN1Y2Nlc3MpIHsKICAgICAgICByZXF1aXJlKGJhbGFuY2VPZlttc2cuc2VuZGVyXSA&amp;#43;PSB2YWx1ZSk7CgogICAgICAgIGJhbGFuY2VPZlttc2cuc2VuZGVyXSAtPSB2YWx1ZTsKICAgICAgICBiYWxhbmNlT2ZbdG9dICs9IHZhbHVlOwogICAgICAgIGVtaXQgVHJhbnNmZXIobXNnLnNlbmRlciwgdG8sIHZhbHVlKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBldmVudCBBcHByb3ZhbChhZGRyZXNzIGluZGV4ZWQgb3duZXIsIGFkZHJlc3MgaW5kZXhlZCBzcGVuZGVyLCB1aW50MjU2IHZhbHVlKTsKCiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gbWFwcGluZyhhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpKSBwdWJsaWMgYWxsb3dhbmNlOwoKICAgIGZ1bmN0aW9uIGFwcHJvdmUoYWRkcmVzcyBzcGVuZGVyLCB1aW50MjU2IHZhbHVlKQogICAgICAgIHB1YmxpYwogICAgICAgIHJldHVybnMgKGJvb2wgc3VjY2VzcykKICAgIHsKICAgICAgICBhbGxvd2FuY2VbbXNnLnNlbmRlcl1bc3BlbmRlcl0gPSB2YWx1ZTsKICAgICAgICBlbWl0IEFwcHJvdmFsKG1zZy5zZW5kZXIsIHNwZW5kZXIsIHZhbHVlKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2ZlckZyb20oYWRkcmVzcyBmcm9tLCBhZGRyZXNzIHRvLCB1aW50MjU2IHZhbHVlKQogICAgICAgIHB1YmxpYwogICAgICAgIHJldHVybnMgKGJvb2wgc3VjY2VzcykKICAgIHsKICAgICAgICByZXF1aXJlKHZhbHVlIDw9IGJhbGFuY2VPZltmcm9tXSk7CiAgICAgICAgcmVxdWlyZSh2YWx1ZSA8PSBhbGxvd2FuY2VbZnJvbV1bbXNnLnNlbmRlcl0pOwoKICAgICAgICBiYWxhbmNlT2ZbZnJvbV0gLT0gdmFsdWU7CiAgICAgICAgYmFsYW5jZU9mW3RvXSArPSB2YWx1ZTsKICAgICAgICBhbGxvd2FuY2VbZnJvbV1bbXNnLnNlbmRlcl0gLT0gdmFsdWU7CiAgICAgICAgZW1pdCBUcmFuc2Zlcihmcm9tLCB0bywgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cg==&#34; download=&#39;baseerc20token.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39;dn expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;mintable.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7CgppbXBvcnQgImJhc2VlcmMyMHRva2VuLnNvbCI7Cgpjb250cmFjdCBNaW50YWJsZVRva2VuIGlzIEJhc2VFUkMyMFRva2VuIHsKICAgIGFkZHJlc3MgcHVibGljIG93bmVyID0gbXNnLnNlbmRlcjsKCiAgICBjb25zdHJ1Y3RvcigKICAgICAgICB1aW50MjU2IF90b3RhbFN1cHBseSwKICAgICAgICB1aW50OCBfZGVjaW1hbHMsCiAgICAgICAgc3RyaW5nIF9uYW1lLAogICAgICAgIHN0cmluZyBfc3ltYm9sCiAgICApIEJhc2VFUkMyMFRva2VuKF90b3RhbFN1cHBseSwgX2RlY2ltYWxzLCBfbmFtZSwgX3N5bWJvbCkgcHVibGljCiAgICB7CiAgICB9CgogICAgZnVuY3Rpb24gbWludChhZGRyZXNzIHJlY2lwaWVudCwgdWludDI1NiBhbW91bnQpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IG93bmVyKTsKICAgICAgICByZXF1aXJlKHRvdGFsU3VwcGx5ICsgYW1vdW50ID49IHRvdGFsU3VwcGx5KTsgLy8gT3ZlcmZsb3cgY2hlY2sKCiAgICAgICAgdG90YWxTdXBwbHkgKz0gYW1vdW50OwogICAgICAgIGJhbGFuY2VPZltyZWNpcGllbnRdICs9IGFtb3VudDsKICAgICAgICBlbWl0IFRyYW5zZmVyKGFkZHJlc3MoMCksIHJlY2lwaWVudCwgYW1vdW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBidXJuKHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoYW1vdW50IDw9IGJhbGFuY2VPZlttc2cuc2VuZGVyXSk7CgogICAgICAgIHRvdGFsU3VwcGx5IC09IGFtb3VudDsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gLT0gYW1vdW50OwogICAgICAgIGVtaXQgVHJhbnNmZXIobXNnLnNlbmRlciwgYWRkcmVzcygwKSwgYW1vdW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBidXJuRnJvbShhZGRyZXNzIGZyb20sIHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoYW1vdW50IDw9IGJhbGFuY2VPZltmcm9tXSk7CiAgICAgICAgcmVxdWlyZShhbW91bnQgPD0gYWxsb3dhbmNlW2Zyb21dW21zZy5zZW5kZXJdKTsKCiAgICAgICAgdG90YWxTdXBwbHkgLT0gYW1vdW50OwogICAgICAgIGJhbGFuY2VPZltmcm9tXSAtPSBhbW91bnQ7CiAgICAgICAgYWxsb3dhbmNlW2Zyb21dW21zZy5zZW5kZXJdIC09IGFtb3VudDsKICAgICAgICBlbWl0IFRyYW5zZmVyKGZyb20sIGFkZHJlc3MoMCksIGFtb3VudCk7CiAgICB9Cn0K&#34; download=&#39;mintable.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;baseerc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MintableToken&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;BaseERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;_totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;mint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Overflow check&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;burn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;burnFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>State Channels for Two-Player Games</title>
      <link>https://programtheblockchain.com/posts/2018/05/11/state-channels-for-two-player-games/</link>
      <pubDate>Fri, 11 May 2018 13:31:35 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/11/state-channels-for-two-player-games/</guid>
      <description>&lt;p&gt;This post will introduce the concept of &lt;em&gt;state channels&lt;/em&gt; in the context of a two-player game. I&amp;rsquo;ll enhance the contract from &lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/04/two-player-games-in-ethereum/&#34;&gt;Two-Player Games in Ethereum&lt;/a&gt; to support making moves in the game without sending transactions. By avoiding on-chain transactions, the new game will be faster and less expensive.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;what-is-a-state-channel&#34;&gt;What is a State Channel?&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;State channels are a very broad and simple way to think about blockchain interactions which &lt;em&gt;could&lt;/em&gt; occur on the blockchain, but instead get conducted &lt;em&gt;off&lt;/em&gt; of the blockchain, without significantly increasing the risk of any participant. &lt;/p&gt;
&lt;p&gt;&lt;cite class=&#34;f6 ttu tracked fs-normal&#34;&gt;&amp;ndash;Jeff Coleman, 2015&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The preceding quote is from Jeff Coleman&amp;rsquo;s excellent post &lt;a href=&#34;http://www.jeffcoleman.ca/state-channels/&#34;&gt;State Channels&lt;/a&gt;, which is the best introduction to state channels that I&amp;rsquo;ve seen. I encourage you to take a few minutes to read it in its entirety.&lt;/p&gt;

&lt;p&gt;The technology behind state channels should be familiar to readers of this blog. We&amp;rsquo;ve previously covered &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;digital signatures&lt;/a&gt;, which allow participants to commit to state updates, and &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;payment channels&lt;/a&gt;, which are a specific form of state channel. As with a payment channel, using a state channel consists of three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Opening the channel, often including some sort of escrow.&lt;/li&gt;
&lt;li&gt;Exchanging state updates off-chain using digital signatures.&lt;/li&gt;
&lt;li&gt;Closing the channel by providing the latest agreed upon state.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;applying-state-channels-to-a-two-player-game&#34;&gt;Applying State Channels to a Two-Player Game&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;https://programtheblockchain.com/posts/2018/05/04/two-player-games-in-ethereum/&#34;&gt;previous &amp;ldquo;21 game&amp;rdquo; contract&lt;/a&gt; used only on-chain transactions. This has the desirable property of making the game &lt;em&gt;trustless&lt;/em&gt;. The contract enforces the rules of the game and guarantees the fairness of the outcome. However, transactions have downsides. Each transaction requires gas, and each transaction needs to be mined into a block, which takes time.&lt;/p&gt;

&lt;p&gt;By using a state channel, we can avoid some of the transactions without sacrificing the trustlessness. Without a state channel, most of the transactions are players taking turns calling &lt;code&gt;move()&lt;/code&gt;. With a state channel, each player will instead send signed messages indicating their moves directly to their opponent.&lt;/p&gt;

&lt;p&gt;As long as the smart contract accepts such signed messages and updates the game state accordingly, the signed message is just as good as a transaction sent directly to the contract.&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/images/state%20channel.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/state%20channel.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;p&gt;The typical steps using the state channel version of the contract are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Player 1 deploys the contract (on chain).&lt;/li&gt;
&lt;li&gt;Player 2 joins the game (on chain).&lt;/li&gt;
&lt;li&gt;Players make moves by exchanging signed states (off chain).&lt;/li&gt;
&lt;li&gt;The winning player makes their final move based on a signed message from their opponent (on chain).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As compared to the previous version of the contract, calls to &lt;code&gt;move()&lt;/code&gt; can be replaced with signed messages exchanged off chain, and a new &lt;code&gt;moveFromState()&lt;/code&gt; function allows a player to make an on-chain move based on a signed message from their opponent.&lt;/p&gt;

&lt;h2 id=&#34;adding-a-sequence-number&#34;&gt;Adding a Sequence Number&lt;/h2&gt;

&lt;p&gt;At any time, either player can send a recent signed message from their opponent to the smart contract. The opponent signed the state explicitly in a message, and the sender signed it implicitly by sending it in a transaction. Because both players have signed the message, it represents an agreement between the two players. This does not, however, mean that it is a &lt;em&gt;new&lt;/em&gt; state.&lt;/p&gt;

&lt;p&gt;To know if a state is new, state updates will include a sequence number that always increases. A state with a higher sequence number always takes precedence over a state with a lower sequence number. This makes it impossible for a player to cheat by trying to submit an old game state to the smart contract.&lt;/p&gt;

&lt;p&gt;The previous contract already includes a &lt;code&gt;GameState&lt;/code&gt; struct. I&amp;rsquo;ve added a sequence number called &lt;code&gt;seq&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When both players are cooperating and communicating directly, there&amp;rsquo;s no need to call &lt;code&gt;move()&lt;/code&gt;, but the function still needs to be there to handle the case where one player stops sending signed messages. In that case, the fallback is for players to use on-chain transactions to move the game forward.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;move()&lt;/code&gt; function must increment the sequence number each time a move is made. I&amp;rsquo;ve also added the expected current sequence number as a parameter. This prevents a race condition where one player sends a &lt;code&gt;move()&lt;/code&gt; transaction but by the time it arrives at the smart contract, the contract&amp;rsquo;s state has changed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Incorrect sequence number.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;using-a-signed-state&#34;&gt;Using a Signed State&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;move()&lt;/code&gt; function allows a player to move based on the last state registered with the smart contract. With a state channel, though, the latest (off-chain) state is probably &lt;em&gt;not&lt;/em&gt; known to the smart contract. To make an on-chain move from an off-chain state, the player must present that state to the smart contract, signed by their opponent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;moveFromState&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Sequence number cannot go backwards.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A brief explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The parameters &lt;code&gt;seq&lt;/code&gt; and &lt;code&gt;num&lt;/code&gt; represent the state signed by the opponent. The &lt;code&gt;whoseTurn&lt;/code&gt; value is implicit; if player 1 signs a state, it is by definition now player 2&amp;rsquo;s turn.&lt;/li&gt;
&lt;li&gt;The signature is checked using &lt;code&gt;prefixed()&lt;/code&gt; and &lt;code&gt;recoverSigner()&lt;/code&gt;, which are borrowed from my post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;Signing and Verifying Messages in Ethereum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The address of the contract is included in signed message to prevent cross-contract replay attacks as described in &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;Signing and Verifying Messages in Ethereum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The contract&amp;rsquo;s game state is replaced with the signed state.&lt;/li&gt;
&lt;li&gt;Finally, &lt;code&gt;move()&lt;/code&gt; is called to apply the player&amp;rsquo;s move.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although &lt;code&gt;moveFromState()&lt;/code&gt; &lt;em&gt;can&lt;/em&gt; be called at any time, it is usually only called once per game: to make the winning move and collect the wagered ether.&lt;/p&gt;

&lt;h2 id=&#34;on-chain-fallback&#34;&gt;On-chain Fallback&lt;/h2&gt;

&lt;p&gt;Typically, game moves are made by exchanging signed messages rather than using on-chain transactions. However, in the case where one player stops sending signed messages&amp;mdash;either as an attempt to stall the game or because of a communication problem&amp;mdash;it&amp;rsquo;s important that players can fall back to using the smart contract.&lt;/p&gt;

&lt;p&gt;Just as in the previous contract, if a player&amp;rsquo;s opponent has stopped making moves, the player needs to invoke a timeout by calling &lt;code&gt;startTimeout()&lt;/code&gt;. For the smart contract to allow such a call, it must know the current game state&amp;mdash;or at least whose turn it is. A player can first call &lt;code&gt;moveFromState()&lt;/code&gt; to inform the smart contract of the latest agreed-upon state and to apply their latest move. This makes it their opponent&amp;rsquo;s turn and allows the timeout to be started.&lt;/p&gt;

&lt;p&gt;In response to a timeout, the player whose turn it is must make a move by calling &lt;code&gt;move()&lt;/code&gt;. This resets the timer and lets the game continue. Players can then resume the typical workflow of exchanging signed messages, or they can continue to make moves on chain.&lt;/p&gt;

&lt;h2 id=&#34;why-can-the-sequence-number-stay-the-same&#34;&gt;Why Can the Sequence Number Stay the Same?&lt;/h2&gt;

&lt;p&gt;The requirement &lt;code&gt;seq &amp;gt;= state.seq&lt;/code&gt; in &lt;code&gt;moveFromState()&lt;/code&gt; may surprise you. Why doesn&amp;rsquo;t this read &lt;code&gt;seq &amp;gt; state.seq&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Before answering the question, I&amp;rsquo;d like to establish two important invariants for the smart contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once a player has committed to a move in a signed message, they cannot undo that move. Otherwise, the game is not trustless.&lt;/li&gt;
&lt;li&gt;The sequence number increases with each move made. Otherwise, there&amp;rsquo;s no guarantee the game will end.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It seems at first that the combination of signed messages and the requirement &lt;code&gt;seq &amp;gt; state.seq&lt;/code&gt; would take care of both invariants. However, consider the following scenario from a chess game:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the middle of the game, Alice makes a threatening move. She does this by sending Bob a signed message with a sequence number 15 and a complete game state.&lt;/li&gt;
&lt;li&gt;Bob responds by moving his queen. He signs a new message with the sequence number 16 and a new game state.&lt;/li&gt;
&lt;li&gt;Alice notices she can capture Bob&amp;rsquo;s queen with her knight. She does so by sending a message to Bob with sequence number 17 and a new game state.&lt;/li&gt;
&lt;li&gt;Bob, who is very unhappy to have lost his queen, does something tricky. He sends a transaction to the smart contract with Alice&amp;rsquo;s signed message at sequence number 15 and makes a &lt;em&gt;different&lt;/em&gt; move (#16) than the one he previously sent to Alice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After this, the sequence number the smart contract knows about is 16. Alice has a message from Bob indicating his original move, but she can&amp;rsquo;t use it, because its sequence number is also 16. This violates the first invariant, because Bob was able to undo a move he committed to.&lt;/p&gt;

&lt;p&gt;Relaxing the requirement to &lt;code&gt;seq &amp;gt;= state.seq&lt;/code&gt; takes care of this problem. Alice can submit Bob&amp;rsquo;s signed message with sequence number &lt;em&gt;16&lt;/em&gt;, forcing him to stick with his original move.&lt;/p&gt;

&lt;p&gt;Even with the relaxed requirement, &lt;code&gt;moveFromState()&lt;/code&gt; maintains the second invariant because the new move increments the sequence number.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;State channels enable off-chain signed messages to replace expensive on-chain transactions.&lt;/li&gt;
&lt;li&gt;Sequence numbers ensure that the smart contract will eventually know the latest state.&lt;/li&gt;
&lt;li&gt;The nature of a turn-based game means that the smart contract must force forward progress to be made. This leads to subtlety in how sequence numbers are treated.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s important that an on-chain fallback exists for the case where off-chain communication breaks down.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;future-posts&#34;&gt;Future Posts&lt;/h2&gt;

&lt;p&gt;I have not yet dealt with how end users would interact with a game based on a state channel. The next post in this series will show a JavaScript front end that takes care of the tricky business of signing and exchanging states and interacting with the smart contract as needed.&lt;/p&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;twentyone-statechannels.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7Cgpjb250cmFjdCBUd2VudHlPbmVHYW1lIHsKICAgIGFkZHJlc3MgcHVibGljIHBsYXllcjE7CiAgICBhZGRyZXNzIHB1YmxpYyBwbGF5ZXIyOwogICAgdWludDI1NiBwdWJsaWMgYmV0QW1vdW50OwogICAgYm9vbCBwdWJsaWMgZ2FtZU92ZXI7CgogICAgc3RydWN0IEdhbWVTdGF0ZSB7CiAgICAgICAgdWludDggc2VxOwogICAgICAgIHVpbnQ4IG51bTsKICAgICAgICBhZGRyZXNzIHdob3NlVHVybjsKICAgIH0KICAgIEdhbWVTdGF0ZSBwdWJsaWMgc3RhdGU7CgogICAgdWludDI1NiBwdWJsaWMgdGltZW91dEludGVydmFsOwogICAgdWludDI1NiBwdWJsaWMgdGltZW91dCA9IDIqKjI1NiAtIDE7CgogICAgZXZlbnQgR2FtZVN0YXJ0ZWQoKTsKICAgIGV2ZW50IFRpbWVvdXRTdGFydGVkKCk7CiAgICBldmVudCBNb3ZlTWFkZShhZGRyZXNzIHBsYXllciwgdWludDggc2VxLCB1aW50OCB2YWx1ZSk7CgoKICAgIC8vIFNldHVwIG1ldGhvZHMKCiAgICBjb25zdHJ1Y3Rvcih1aW50MjU2IF90aW1lb3V0SW50ZXJ2YWwpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICBwbGF5ZXIxID0gbXNnLnNlbmRlcjsKICAgICAgICBiZXRBbW91bnQgPSBtc2cudmFsdWU7CiAgICAgICAgdGltZW91dEludGVydmFsID0gX3RpbWVvdXRJbnRlcnZhbDsKICAgIH0KCiAgICBmdW5jdGlvbiBqb2luKCkgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUocGxheWVyMiA9PSAwLCAiR2FtZSBoYXMgYWxyZWFkeSBzdGFydGVkLiIpOwogICAgICAgIHJlcXVpcmUoIWdhbWVPdmVyLCAiR2FtZSB3YXMgY2FuY2VsZWQuIik7CiAgICAgICAgcmVxdWlyZShtc2cudmFsdWUgPT0gYmV0QW1vdW50LCAiV3JvbmcgYmV0IGFtb3VudC4iKTsKCiAgICAgICAgcGxheWVyMiA9IG1zZy5zZW5kZXI7CiAgICAgICAgc3RhdGUud2hvc2VUdXJuID0gcGxheWVyMTsKCiAgICAgICAgZW1pdCBHYW1lU3RhcnRlZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHBsYXllcjEsICJPbmx5IGZpcnN0IHBsYXllciBtYXkgY2FuY2VsLiIpOwogICAgICAgIHJlcXVpcmUocGxheWVyMiA9PSAwLCAiR2FtZSBoYXMgYWxyZWFkeSBzdGFydGVkLiIpOwoKICAgICAgICBnYW1lT3ZlciA9IHRydWU7CiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgfQoKCiAgICAvLyBQbGF5IG1ldGhvZHMKCiAgICBmdW5jdGlvbiBtb3ZlKHVpbnQ4IHNlcSwgdWludDggdmFsdWUpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZSghZ2FtZU92ZXIsICJHYW1lIGhhcyBlbmRlZC4iKTsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gc3RhdGUud2hvc2VUdXJuLCAiTm90IHlvdXIgdHVybi4iKTsKICAgICAgICByZXF1aXJlKHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMywKICAgICAgICAgICAgIk1vdmUgb3V0IG9mIHJhbmdlLiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMy4iKTsKICAgICAgICByZXF1aXJlKHN0YXRlLm51bSArIHZhbHVlIDw9IDIxLCAiTW92ZSB3b3VsZCBleGNlZWQgMjEuIik7CiAgICAgICAgcmVxdWlyZShzdGF0ZS5zZXEgPT0gc2VxLCAiSW5jb3JyZWN0IHNlcXVlbmNlIG51bWJlci4iKTsKCiAgICAgICAgc3RhdGUubnVtICs9IHZhbHVlOwogICAgICAgIHN0YXRlLndob3NlVHVybiA9IG9wcG9uZW50T2YobXNnLnNlbmRlcik7CiAgICAgICAgc3RhdGUuc2VxICs9IDE7CgogICAgICAgIC8vIENsZWFyIHRpbWVvdXQKICAgICAgICB0aW1lb3V0ID0gMioqMjU2IC0gMTsKCiAgICAgICAgaWYgKHN0YXRlLm51bSA9PSAyMSkgewogICAgICAgICAgICBnYW1lT3ZlciA9IHRydWU7CiAgICAgICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYWRkcmVzcyh0aGlzKS5iYWxhbmNlKTsKICAgICAgICB9CgogICAgICAgIGVtaXQgTW92ZU1hZGUobXNnLnNlbmRlciwgc2VxLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbW92ZUZyb21TdGF0ZSh1aW50OCBzZXEsIHVpbnQ4IG51bSwgYnl0ZXMgc2lnLCB1aW50OCB2YWx1ZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHNlcSA&amp;#43;PSBzdGF0ZS5zZXEsICJTZXF1ZW5jZSBudW1iZXIgY2Fubm90IGdvIGJhY2t3YXJkcy4iKTsKCiAgICAgICAgYnl0ZXMzMiBtZXNzYWdlID0gcHJlZml4ZWQoa2VjY2FrMjU2KGFkZHJlc3ModGhpcyksIHNlcSwgbnVtKSk7CiAgICAgICAgcmVxdWlyZShyZWNvdmVyU2lnbmVyKG1lc3NhZ2UsIHNpZykgPT0gb3Bwb25lbnRPZihtc2cuc2VuZGVyKSk7CgogICAgICAgIHN0YXRlLnNlcSA9IHNlcTsKICAgICAgICBzdGF0ZS5udW0gPSBudW07CiAgICAgICAgc3RhdGUud2hvc2VUdXJuID0gbXNnLnNlbmRlcjsKCiAgICAgICAgbW92ZShzZXEsIHZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBvcHBvbmVudE9mKGFkZHJlc3MgcGxheWVyKSBpbnRlcm5hbCB2aWV3IHJldHVybnMgKGFkZHJlc3MpIHsKICAgICAgICByZXF1aXJlKHBsYXllcjIgIT0gMCwgIkdhbWUgaGFzIG5vdCBzdGFydGVkLiIpOwoKICAgICAgICBpZiAocGxheWVyID09IHBsYXllcjEpIHsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcjI7CiAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXIgPT0gcGxheWVyMikgewogICAgICAgICAgICByZXR1cm4gcGxheWVyMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXZlcnQoIkludmFsaWQgcGxheWVyLiIpOwogICAgICAgIH0KICAgIH0KCgogICAgLy8gVGltZW91dCBtZXRob2RzCgogICAgZnVuY3Rpb24gc3RhcnRUaW1lb3V0KCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKCFnYW1lT3ZlciwgIkdhbWUgaGFzIGVuZGVkLiIpOwogICAgICAgIHJlcXVpcmUoc3RhdGUud2hvc2VUdXJuID09IG9wcG9uZW50T2YobXNnLnNlbmRlciksCiAgICAgICAgICAgICJDYW5ub3Qgc3RhcnQgYSB0aW1lb3V0IG9uIHlvdXJzZWxmLiIpOwoKICAgICAgICB0aW1lb3V0ID0gbm93ICsgdGltZW91dEludGVydmFsOwogICAgICAgIGVtaXQgVGltZW91dFN0YXJ0ZWQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFpbVRpbWVvdXQoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoIWdhbWVPdmVyLCAiR2FtZSBoYXMgZW5kZWQuIik7CiAgICAgICAgcmVxdWlyZShub3cgPj0gdGltZW91dCk7CgogICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICBvcHBvbmVudE9mKHN0YXRlLndob3NlVHVybikudHJhbnNmZXIoYWRkcmVzcyh0aGlzKS5iYWxhbmNlKTsKICAgIH0KCgogICAgLy8gU2lnbmF0dXJlIG1ldGhvZHMKCiAgICBmdW5jdGlvbiBzcGxpdFNpZ25hdHVyZShieXRlcyBzaWcpCiAgICAgICAgaW50ZXJuYWwKICAgICAgICBwdXJlCiAgICAgICAgcmV0dXJucyAodWludDgsIGJ5dGVzMzIsIGJ5dGVzMzIpCiAgICB7CiAgICAgICAgcmVxdWlyZShzaWcubGVuZ3RoID09IDY1KTsKCiAgICAgICAgYnl0ZXMzMiByOwogICAgICAgIGJ5dGVzMzIgczsKICAgICAgICB1aW50OCB2OwoKICAgICAgICBhc3NlbWJseSB7CiAgICAgICAgICAgIC8vIGZpcnN0IDMyIGJ5dGVzLCBhZnRlciB0aGUgbGVuZ3RoIHByZWZpeAogICAgICAgICAgICByIDo9IG1sb2FkKGFkZChzaWcsIDMyKSkKICAgICAgICAgICAgLy8gc2Vjb25kIDMyIGJ5dGVzCiAgICAgICAgICAgIHMgOj0gbWxvYWQoYWRkKHNpZywgNjQpKQogICAgICAgICAgICAvLyBmaW5hbCBieXRlIChmaXJzdCBieXRlIG9mIHRoZSBuZXh0IDMyIGJ5dGVzKQogICAgICAgICAgICB2IDo9IGJ5dGUoMCwgbWxvYWQoYWRkKHNpZywgOTYpKSkKICAgICAgICB9CgogICAgICAgIHJldHVybiAodiwgciwgcyk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb3ZlclNpZ25lcihieXRlczMyIG1lc3NhZ2UsIGJ5dGVzIHNpZykKICAgICAgICBpbnRlcm5hbAogICAgICAgIHB1cmUKICAgICAgICByZXR1cm5zIChhZGRyZXNzKQogICAgewogICAgICAgIHVpbnQ4IHY7CiAgICAgICAgYnl0ZXMzMiByOwogICAgICAgIGJ5dGVzMzIgczsKCiAgICAgICAgKHYsIHIsIHMpID0gc3BsaXRTaWduYXR1cmUoc2lnKTsKCiAgICAgICAgcmV0dXJuIGVjcmVjb3ZlcihtZXNzYWdlLCB2LCByLCBzKTsKICAgIH0KCiAgICAvLyBCdWlsZHMgYSBwcmVmaXhlZCBoYXNoIHRvIG1pbWljIHRoZSBiZWhhdmlvciBvZiBldGhfc2lnbi4KICAgIGZ1bmN0aW9uIHByZWZpeGVkKGJ5dGVzMzIgaGFzaCkgaW50ZXJuYWwgcHVyZSByZXR1cm5zIChieXRlczMyKSB7CiAgICAgICAgcmV0dXJuIGtlY2NhazI1NigiXHgxOUV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOlxuMzIiLCBoYXNoKTsKICAgIH0KfQo=&#34; download=&#39;twentyone-statechannels.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TwentyOneGame&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Setup methods&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game was canceled.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Wrong bet amount.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only first player may cancel.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Play methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Not your turn.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move out of range. Must be between 1 and 3.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move would exceed 21.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Incorrect sequence number.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Clear timeout&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;moveFromState&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Sequence number cannot go backwards.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seq&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has not started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;revert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Invalid player.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Timeout methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Cannot start a timeout on yourself.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Signature methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Parimutuel Wager Contract</title>
      <link>https://programtheblockchain.com/posts/2018/05/08/writing-a-parimutuel-wager-contract/</link>
      <pubDate>Tue, 08 May 2018 05:37:16 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/08/writing-a-parimutuel-wager-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a smart contract that implements parimutuel betting.  The contract will accept and pay off bets on the outcome of a single proposition.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Parimutuel_betting&#34;&gt;Parimutuel betting&lt;/a&gt; is a simple way of managing bets and paying off winners.
For a given proposition, there are multiple mutually-exclusive outcomes to bet on, only one of which will win.  For each possible outcome, a separate tally of bets is maintained.  After determining the winning outcome, all of the wagered money is divided amongst those who bet correctly.  The money awarded to a bettor is proportional to the fraction of the winning wagers that bettor represents.  An example will help.&lt;/p&gt;

&lt;p&gt;Suppose $1000 total is bet on the horses in a race, with $200 of that being bet on the winner.  Furthermore, suppose that you bet $30 on the winner.  Your bet represents 15% ($30/$200) of the winning bets, so you are entitled to 15% of all the money bet ($1000).  Therefore, you would receive $150.&lt;/p&gt;

&lt;h2 id=&#34;a-trusted-oracle&#34;&gt;A Trusted &amp;ldquo;Oracle&amp;rdquo;&lt;/h2&gt;

&lt;p&gt;Unlike most of our smart contracts, this contract will require some off-blockchain information to pay off bets.  Specifically, I am assuming that the bets are about off-chain events like political elections or sporting events.&lt;/p&gt;

&lt;p&gt;One motivation for blockchains and smart contracts is distrust of non-chain entities.  To resolve a bet about an external event, we must trust some off-chain entity to present the winning outcome.  Such an entity is called an
&amp;ldquo;&lt;a href=&#34;https://blockchainhub.net/blockchain-oracles/&#34;&gt;oracle&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;Creating an independent, distributed, trusted oracle is beyond the scope of this post, so I&amp;rsquo;m going to just assume that bettors trust the contract&amp;rsquo;s owner to resolve bets correctly.&lt;/p&gt;

&lt;h2 id=&#34;parameterization&#34;&gt;Parameterization&lt;/h2&gt;

&lt;p&gt;Bets are parameterized by a description of the proposition and a list of the possible outcomes.  I use &lt;code&gt;bytes32&lt;/code&gt; rather than &lt;code&gt;string&lt;/code&gt; for each outcome due to a Solidity limitation.  (Solidity does not support an array of strings as a parameter to the constructor.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ParimutuelContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;proposition&lt;/code&gt; and &lt;code&gt;outcomes&lt;/code&gt; values are purely descriptive.  They are used by external entities to understand what proposition the contract represents.  They are not used in the rest of the contract.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;timeout&lt;/code&gt; is used to safeguard bettors from the possibility that the owner never resolves the proposition and bets are never paid off.  It is used in &lt;code&gt;cancel&lt;/code&gt; below.&lt;/p&gt;

&lt;h2 id=&#34;bet-tracking&#34;&gt;Bet Tracking&lt;/h2&gt;

&lt;p&gt;The contract can be in one of four states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Open&lt;/code&gt;: the state when bets are accepted&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Closed&lt;/code&gt;: the state after bets are accepted but before the winner is known&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Resolved&lt;/code&gt;: the state after the winner is known during which bets are paid off&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cancelled&lt;/code&gt;: the state of having been cancelled.  Any unresolved bet can be cancelled.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;betting&#34;&gt;Betting&lt;/h2&gt;

&lt;p&gt;Bet outcomes are indicated using the index into the &lt;code&gt;outcomes&lt;/code&gt; array corresponding to the desired outcome.&lt;/p&gt;

&lt;p&gt;Tracking bets requires updating three running tallies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;betAmounts&lt;/code&gt; tracks per-bettor bets on individual outcomes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;totalPerOutcome&lt;/code&gt; tracks the total amount bet on each specific outcome.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;total&lt;/code&gt; tracks the total amount bet.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;128&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// avoid overflow possibility&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the code limits the total amount bet.  It does so to avoid a potential overflow in the computation of bet payoffs.  The limit is conservative.&lt;/p&gt;

&lt;h2 id=&#34;closing-betting&#34;&gt;Closing Betting&lt;/h2&gt;

&lt;p&gt;Only the owner can close betting, which is simply a change to the &lt;code&gt;state&lt;/code&gt; from &lt;code&gt;Open&lt;/code&gt; to &lt;code&gt;Closed&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;resolving-the-bet&#34;&gt;Resolving the Bet&lt;/h2&gt;

&lt;p&gt;The owner resolves the bet by indicating the winning outcome. This also changes the &lt;code&gt;state&lt;/code&gt; of the bet from &lt;code&gt;Closed&lt;/code&gt; to &lt;code&gt;Resolved&lt;/code&gt;.  I could have allowed a direct transition from &lt;code&gt;Open&lt;/code&gt; to &lt;code&gt;Resolved&lt;/code&gt;, but this is simpler.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;claiming-winnings&#34;&gt;Claiming Winnings&lt;/h2&gt;

&lt;p&gt;Once a winning outcome has been declared, claiming winnings is straightforward.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that we can be certain that the multiplication cannot overflow because of the limit on &lt;code&gt;total&lt;/code&gt; enforced in &lt;code&gt;bet&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;cancelling-the-bet&#34;&gt;Cancelling the Bet&lt;/h2&gt;

&lt;p&gt;An unresolved bet can be cancelled under either of two conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The owner can cancel an unresolved bet at any time.&lt;/li&gt;
&lt;li&gt;Anybody can cancel an unresolved bet after the timeout.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bettors must be able to reclaim bets made prior to cancellation.  To keep things simple, the contract does not keep track of the total amount bet by each bettor.  Therefore, refunds must be requested on a per-outcome basis.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;incentives&#34;&gt;Incentives&lt;/h2&gt;

&lt;p&gt;I ignored the fact that gambling establishments typically keep a portion of the bets for themselves.  Such a vig would not introduce significant complexity to this contract.  The &lt;code&gt;claim&lt;/code&gt; function would need to scale down payments, and the remainder would need to be paid to the owner.&lt;/p&gt;

&lt;p&gt;While a vig-less contract may seem desirable, it has one significant drawback: the owner has no tangible incentive to actually resolve the proposition.  Compensating the owner only after they resolve the proposition would give them incentive to do so.  It would also give them incentive to resolve the proposition &lt;em&gt;truthfully&lt;/em&gt;.  Someone who regularly creates propositions needs to maintain an honest reputation to encourage future participation.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The smart contract supports parimutuel betting.&lt;/li&gt;
&lt;li&gt;The contract goes through multiple states, which are tracked explicitly with &lt;code&gt;enum&lt;/code&gt; values.&lt;/li&gt;
&lt;li&gt;The contract relies on its owner to transition between states and to resolve the proposition.&lt;/li&gt;
&lt;li&gt;The contract employs a timeout to guard against a perpetually unresolved proposition.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;parimutuel.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7Cgpjb250cmFjdCBQYXJpbXV0dWVsQ29udHJhY3QgewogICAgYWRkcmVzcyBwdWJsaWMgb3duZXI7CgogICAgc3RyaW5nIHB1YmxpYyBwcm9wb3NpdGlvbjsKICAgIGJ5dGVzMzJbXSBwdWJsaWMgb3V0Y29tZXM7CiAgICB1aW50MjU2IHB1YmxpYyB0aW1lb3V0OwoKICAgIGNvbnN0cnVjdG9yKHN0cmluZyBfcHJvcG9zaXRpb24sIGJ5dGVzMzJbXSBfb3V0Y29tZXMsIHVpbnQyNTYgdGltZW91dERlbGF5KQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIG93bmVyID0gbXNnLnNlbmRlcjsKICAgICAgICBwcm9wb3NpdGlvbiA9IF9wcm9wb3NpdGlvbjsKICAgICAgICBvdXRjb21lcyA9IF9vdXRjb21lczsKICAgICAgICB0aW1lb3V0ID0gbm93ICsgdGltZW91dERlbGF5OwogICAgfQoKICAgIGVudW0gU3RhdGVzIHsgT3BlbiwgQ2xvc2VkLCBSZXNvbHZlZCwgQ2FuY2VsbGVkIH0KICAgIFN0YXRlcyBzdGF0ZSA9IFN0YXRlcy5PcGVuOwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiBtYXBwaW5nKHVpbnQyNTYgPT4gdWludDI1NikpIHB1YmxpYyBiZXRBbW91bnRzOwogICAgbWFwcGluZyh1aW50MjU2ID0&amp;#43;IHVpbnQyNTYpIHB1YmxpYyB0b3RhbFBlck91dGNvbWU7CiAgICB1aW50MjU2IHB1YmxpYyB0b3RhbDsKCiAgICB1aW50MjU2IHdpbm5pbmdPdXRjb21lOwoKICAgIGZ1bmN0aW9uIGJldCh1aW50MjU2IG91dGNvbWUpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5PcGVuKTsKCiAgICAgICAgYmV0QW1vdW50c1ttc2cuc2VuZGVyXVtvdXRjb21lXSArPSBtc2cudmFsdWU7CiAgICAgICAgdG90YWxQZXJPdXRjb21lW291dGNvbWVdICs9IG1zZy52YWx1ZTsKICAgICAgICB0b3RhbCArPSBtc2cudmFsdWU7CiAgICAgICAgcmVxdWlyZSh0b3RhbCA8IDIgKiogMTI4KTsgICAvLyBhdm9pZCBvdmVyZmxvdyBwb3NzaWJpbGl0eQogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5PcGVuKTsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIpOwoKICAgICAgICBzdGF0ZSA9IFN0YXRlcy5DbG9zZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzb2x2ZSh1aW50MjU2IF93aW5uaW5nT3V0Y29tZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5DbG9zZWQpOwogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBvd25lcik7CgogICAgICAgIHdpbm5pbmdPdXRjb21lID0gX3dpbm5pbmdPdXRjb21lOwogICAgICAgIHN0YXRlID0gU3RhdGVzLlJlc29sdmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYWltKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKHN0YXRlID09IFN0YXRlcy5SZXNvbHZlZCk7CgogICAgICAgIHVpbnQyNTYgYW1vdW50ID0gYmV0QW1vdW50c1ttc2cuc2VuZGVyXVt3aW5uaW5nT3V0Y29tZV0gKiB0b3RhbAogICAgICAgICAgICAvIHRvdGFsUGVyT3V0Y29tZVt3aW5uaW5nT3V0Y29tZV07CiAgICAgICAgYmV0QW1vdW50c1ttc2cuc2VuZGVyXVt3aW5uaW5nT3V0Y29tZV0gPSAwOwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWwoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoc3RhdGUgIT0gU3RhdGVzLlJlc29sdmVkKTsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIgfHwgbm93ID4gdGltZW91dCk7CgogICAgICAgIHN0YXRlID0gU3RhdGVzLkNhbmNlbGxlZDsKICAgIH0KCiAgICBmdW5jdGlvbiByZWZ1bmQodWludDI1NiBvdXRjb21lKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoc3RhdGUgPT0gU3RhdGVzLkNhbmNlbGxlZCk7CgogICAgICAgIHVpbnQyNTYgYW1vdW50ID0gYmV0QW1vdW50c1ttc2cuc2VuZGVyXVtvdXRjb21lXTsKICAgICAgICBiZXRBbW91bnRzW21zZy5zZW5kZXJdW291dGNvbWVdID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9Cn0K&#34; download=&#39;parimutuel.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ParimutuelContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;proposition&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_proposition&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;outcomes&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_outcomes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutDelay&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;128&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// avoid overflow possibility&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Open&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Closed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;total&lt;/span&gt;
            &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPerOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;winningOutcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Resolved&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;refund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;States&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Cancelled&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmounts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;outcome&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Two-Player Games in Ethereum</title>
      <link>https://programtheblockchain.com/posts/2018/05/04/two-player-games-in-ethereum/</link>
      <pubDate>Fri, 04 May 2018 09:57:46 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/04/two-player-games-in-ethereum/</guid>
      <description>&lt;p&gt;This is the first post in a series about building efficient two-player games in Ethereum. This post will demonstrate a simple, but complete, smart contract that implements a variant of &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Nim#The_21_game&#34;&gt;the 21 game&lt;/a&gt;.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;the-game&#34;&gt;The Game&lt;/h2&gt;

&lt;p&gt;For this first contract, I wanted to keep the game logic as simple as possible, so I chose &lt;a href=&#34;https://en.wikipedia.org/wiki/Nim#The_21_game&#34;&gt;the 21 game&lt;/a&gt;. I made up a slight variant:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The number starts at 0.&lt;/li&gt;
&lt;li&gt;Two players take turns increasing the number by between 1 and 3 (inclusive).&lt;/li&gt;
&lt;li&gt;The player who reaches 21 wins.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An example of a valid game might look like this: 0, 1, 5, 7, 9, 10, 13, 16, 17, 19, 21. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For the smart contract version, the two players are going to wager on the outcome of the game. They must each contribute an equal amount of ether, and all of the ether goes to the winner.&lt;/p&gt;

&lt;h2 id=&#34;handling-the-game-state&#34;&gt;Handling the Game State&lt;/h2&gt;

&lt;p&gt;The contract must track a small amount of game state. The state variables &lt;code&gt;player1&lt;/code&gt; and &lt;code&gt;player2&lt;/code&gt; track the two participants, &lt;code&gt;betAmount&lt;/code&gt; tracks the amount of ether (in wei) wagered, &lt;code&gt;state&lt;/code&gt; tracks the number being increased on the way to 21 and whose turn it is next.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ll describe &lt;code&gt;timeout&lt;/code&gt; and &lt;code&gt;timeoutInterval&lt;/code&gt; later in this post.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TwentyOneGame&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;starting-the-game&#34;&gt;Starting the Game&lt;/h2&gt;

&lt;p&gt;The account that deployed the contract is known as &lt;code&gt;player1&lt;/code&gt;. To establish itself as &lt;code&gt;player2&lt;/code&gt;, an account calls &lt;code&gt;join()&lt;/code&gt; and matches &lt;code&gt;player1&lt;/code&gt;&amp;rsquo;s wager. Any time before a second player has joined, &lt;code&gt;player1&lt;/code&gt; may call &lt;code&gt;cancel()&lt;/code&gt; to cancel the game and recover their wager:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game was canceled.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Wrong bet amount.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only first player may cancel.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;moving-the-game-forward&#34;&gt;Moving the Game Forward&lt;/h2&gt;

&lt;p&gt;Players take turns by increasing &lt;code&gt;num&lt;/code&gt; until 21 is reached. The smart contract is responsible for tracking the game state and enforcing the rules of the game:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Players must take turns.&lt;/li&gt;
&lt;li&gt;Players must increase the number by between 1 and 3 (inclusive).&lt;/li&gt;
&lt;li&gt;The number cannot exceed 21.&lt;/li&gt;
&lt;li&gt;The first player to reach 21 wins.&lt;/li&gt;
&lt;li&gt;A player who abandons the game forfeits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To enforce that last rule, I&amp;rsquo;ll employ a timeout. Regular readers of this blog will note that we use timeouts a lot&amp;mdash;e.g. in posts about &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;auctions&lt;/a&gt;, &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/&#34;&gt;coin flips&lt;/a&gt;, and &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;payment channels&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Timeouts come up so often because smart contracts cannot force someone to act; they can only punish inaction. Without a timeout, a player who thought they were going to lose would have no incentive to continue playing, and the winning player would be unable to claim their ether.&lt;/p&gt;

&lt;p&gt;The parameter &lt;code&gt;timeoutInterval&lt;/code&gt; specifies how many seconds each player is allowed before they must make a move, and &lt;code&gt;timeout&lt;/code&gt; tracks when that period expires. The timeout is only started when a player feels it&amp;rsquo;s needed.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;move()&lt;/code&gt; function is called by each player to take their turn:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Not your turn.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move out of range. Must be between 1 and 3.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move would exceed 21.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Clear timeout&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of &lt;code&gt;move()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;require&lt;/code&gt; statements make sure the move is a valid one.&lt;/li&gt;
&lt;li&gt;The game &lt;code&gt;state&lt;/code&gt; is updated to reflect the new total and whose turn it is.&lt;/li&gt;
&lt;li&gt;The timeout is reset.&lt;/li&gt;
&lt;li&gt;If the game is over, the winning player receives their prize.&lt;/li&gt;
&lt;li&gt;An event is emitted to help the players know when it&amp;rsquo;s their turn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a player feels their opponent is taking too long to make their move, they can start the timeout process. This sets &lt;code&gt;timeout&lt;/code&gt; and emits an event:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
        &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Cannot start a timeout on yourself.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If the &lt;code&gt;timeout&lt;/code&gt; is reached, this indicates that the player whose turn it is has abandoned the game. They forfeit, making the other player the winner:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A smart contract can enforce the rules of a two-player game.&lt;/li&gt;
&lt;li&gt;Timeouts are needed to punish non-participation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;future-posts&#34;&gt;Future Posts&lt;/h2&gt;

&lt;p&gt;This post is the first in a series. The next post will use &lt;a href=&#34;http://www.jeffcoleman.ca/state-channels/&#34;&gt;state channels&lt;/a&gt; to avoid having to make each move on the blockchain, and a subsequent post will show how to build a JavaScript front-end for the game.&lt;/p&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;twentyone.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7Cgpjb250cmFjdCBUd2VudHlPbmVHYW1lIHsKICAgIGFkZHJlc3MgcHVibGljIHBsYXllcjE7CiAgICBhZGRyZXNzIHB1YmxpYyBwbGF5ZXIyOwogICAgdWludDI1NiBwdWJsaWMgYmV0QW1vdW50OwogICAgYm9vbCBwdWJsaWMgZ2FtZU92ZXI7CgogICAgc3RydWN0IEdhbWVTdGF0ZSB7CiAgICAgICAgdWludDggbnVtOwogICAgICAgIGFkZHJlc3Mgd2hvc2VUdXJuOwogICAgfQogICAgR2FtZVN0YXRlIHB1YmxpYyBzdGF0ZTsKCiAgICB1aW50MjU2IHB1YmxpYyB0aW1lb3V0SW50ZXJ2YWw7CiAgICB1aW50MjU2IHB1YmxpYyB0aW1lb3V0ID0gMioqMjU2IC0gMTsKCiAgICBldmVudCBHYW1lU3RhcnRlZCgpOwogICAgZXZlbnQgVGltZW91dFN0YXJ0ZWQoKTsKICAgIGV2ZW50IE1vdmVNYWRlKGFkZHJlc3MgcGxheWVyLCB1aW50OCB2YWx1ZSk7CgoKICAgIC8vIFNldHVwIG1ldGhvZHMKCiAgICBjb25zdHJ1Y3Rvcih1aW50MjU2IF90aW1lb3V0SW50ZXJ2YWwpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICBwbGF5ZXIxID0gbXNnLnNlbmRlcjsKICAgICAgICBiZXRBbW91bnQgPSBtc2cudmFsdWU7CiAgICAgICAgdGltZW91dEludGVydmFsID0gX3RpbWVvdXRJbnRlcnZhbDsKICAgIH0KCiAgICBmdW5jdGlvbiBqb2luKCkgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUocGxheWVyMiA9PSAwLCAiR2FtZSBoYXMgYWxyZWFkeSBzdGFydGVkLiIpOwogICAgICAgIHJlcXVpcmUoIWdhbWVPdmVyLCAiR2FtZSB3YXMgY2FuY2VsZWQuIik7CiAgICAgICAgcmVxdWlyZShtc2cudmFsdWUgPT0gYmV0QW1vdW50LCAiV3JvbmcgYmV0IGFtb3VudC4iKTsKCiAgICAgICAgcGxheWVyMiA9IG1zZy5zZW5kZXI7CiAgICAgICAgc3RhdGUud2hvc2VUdXJuID0gcGxheWVyMTsKCiAgICAgICAgZW1pdCBHYW1lU3RhcnRlZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHBsYXllcjEsICJPbmx5IGZpcnN0IHBsYXllciBtYXkgY2FuY2VsLiIpOwogICAgICAgIHJlcXVpcmUocGxheWVyMiA9PSAwLCAiR2FtZSBoYXMgYWxyZWFkeSBzdGFydGVkLiIpOwoKICAgICAgICBnYW1lT3ZlciA9IHRydWU7CiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgfQoKCiAgICAvLyBQbGF5IG1ldGhvZHMKCiAgICBmdW5jdGlvbiBtb3ZlKHVpbnQ4IHZhbHVlKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoIWdhbWVPdmVyLCAiR2FtZSBoYXMgZW5kZWQuIik7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHN0YXRlLndob3NlVHVybiwgIk5vdCB5b3VyIHR1cm4uIik7CiAgICAgICAgcmVxdWlyZSh2YWx1ZSA&amp;#43;PSAxICYmIHZhbHVlIDw9IDMsCiAgICAgICAgICAgICJNb3ZlIG91dCBvZiByYW5nZS4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMuIik7CiAgICAgICAgcmVxdWlyZShzdGF0ZS5udW0gKyB2YWx1ZSA8PSAyMSwgIk1vdmUgd291bGQgZXhjZWVkIDIxLiIpOwoKICAgICAgICBzdGF0ZS5udW0gKz0gdmFsdWU7CiAgICAgICAgc3RhdGUud2hvc2VUdXJuID0gb3Bwb25lbnRPZihtc2cuc2VuZGVyKTsKCiAgICAgICAgLy8gQ2xlYXIgdGltZW91dAogICAgICAgIHRpbWVvdXQgPSAyKioyNTYgLSAxOwoKICAgICAgICBpZiAoc3RhdGUubnVtID09IDIxKSB7CiAgICAgICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgICAgIH0KCiAgICAgICAgZW1pdCBNb3ZlTWFkZShtc2cuc2VuZGVyLCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gb3Bwb25lbnRPZihhZGRyZXNzIHBsYXllcikgaW50ZXJuYWwgdmlldyByZXR1cm5zIChhZGRyZXNzKSB7CiAgICAgICAgcmVxdWlyZShwbGF5ZXIyICE9IDAsICJHYW1lIGhhcyBub3Qgc3RhcnRlZC4iKTsKCiAgICAgICAgaWYgKHBsYXllciA9PSBwbGF5ZXIxKSB7CiAgICAgICAgICAgIHJldHVybiBwbGF5ZXIyOwogICAgICAgIH0gZWxzZSBpZiAocGxheWVyID09IHBsYXllcjIpIHsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcjE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV2ZXJ0KCJJbnZhbGlkIHBsYXllci4iKTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vIFRpbWVvdXQgbWV0aG9kcwoKICAgIGZ1bmN0aW9uIHN0YXJ0VGltZW91dCgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZSghZ2FtZU92ZXIsICJHYW1lIGhhcyBlbmRlZC4iKTsKICAgICAgICByZXF1aXJlKHN0YXRlLndob3NlVHVybiA9PSBvcHBvbmVudE9mKG1zZy5zZW5kZXIpLAogICAgICAgICAgICAiQ2Fubm90IHN0YXJ0IGEgdGltZW91dCBvbiB5b3Vyc2VsZi4iKTsKCiAgICAgICAgdGltZW91dCA9IG5vdyArIHRpbWVvdXRJbnRlcnZhbDsKICAgICAgICBlbWl0IFRpbWVvdXRTdGFydGVkKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhaW1UaW1lb3V0KCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKCFnYW1lT3ZlciwgIkdhbWUgaGFzIGVuZGVkLiIpOwogICAgICAgIHJlcXVpcmUobm93ID49IHRpbWVvdXQpOwoKICAgICAgICBnYW1lT3ZlciA9IHRydWU7CiAgICAgICAgb3Bwb25lbnRPZihzdGF0ZS53aG9zZVR1cm4pLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICB9Cn0K&#34; download=&#39;twentyone.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TwentyOneGame&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;GameState&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Setup methods&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game was canceled.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Wrong bet amount.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;GameStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only first player may cancel.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has already started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Play methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;move&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Not your turn.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move out of range. Must be between 1 and 3.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Move would exceed 21.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Clear timeout&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MoveMade&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has not started.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;revert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Invalid player.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Timeout methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Cannot start a timeout on yourself.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutInterval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TimeoutStarted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Game has ended.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;gameOver&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;opponentOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;whoseTurn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;Although this post does not address the strategy of the game, you might be interested to note that the first player (the one who kicked things off with &amp;ldquo;1&amp;rdquo;) played a perfect strategy. Played correctly, the first player should always win.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Dominant Assurance Contract</title>
      <link>https://programtheblockchain.com/posts/2018/05/01/writing-a-dominant-assurance-contract/</link>
      <pubDate>Tue, 01 May 2018 06:15:04 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/05/01/writing-a-dominant-assurance-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a smart contract that implements a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Assurance_contract#Dominant_assurance_contracts&#34;&gt;&amp;ldquo;dominant assurance contract&amp;rdquo;&lt;/a&gt;.
It assumes that you have read our previous post on vanilla
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/19/writing-a-crowdfunding-contract-a-la-kickstarter/&#34;&gt;assurance contracts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Fundraising via assurance contracts like
&lt;a href=&#34;https://www.kickstarter.com&#34;&gt;Kickstarter campaigns&lt;/a&gt;
often suffer from low participation where people who value the proposed good don&amp;rsquo;t contribute funds because they anticipate the goal being met without their contribution, or because they doubt success and don&amp;rsquo;t want to participate in a failing effort. Nonparticipation raises the risk that a campaign will fail.
&lt;a href=&#34;https://mason.gmu.edu/~atabarro/&#34;&gt;Alex Tabarrok&lt;/a&gt;
invented
&lt;a href=&#34;http://mason.gmu.edu/~atabarro/PrivateProvision.pdf&#34;&gt;&amp;ldquo;dominant assurance contracts&amp;rdquo;&lt;/a&gt;
to address this concern.&lt;/p&gt;

&lt;p&gt;Dominant assurance contracts require a patron to stake money that is paid to participants of a &lt;em&gt;failed&lt;/em&gt; campaign.  This payoff is proportional to the original pledge.  For instance, if a patron stakes a 10% payoff, then all participants of a failed campaign would be refunded 110% of their contributions.  The motivation is that participants now benefit no matter what&amp;mdash;either they get a bonus if the campaign fails, or the valued good is produced if the campaign succeeds.&lt;/p&gt;

&lt;h2 id=&#34;staking-the-payoff&#34;&gt;Staking the Payoff&lt;/h2&gt;

&lt;p&gt;The previous
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/19/writing-a-crowdfunding-contract-a-la-kickstarter/&#34;&gt;assurance contract post&lt;/a&gt;
demonstrated how simple it is to implement an assurance contract with a smart contract.  Modifying that code to implement a dominant assurance contract requires just a modest amount more logic.&lt;/p&gt;

&lt;p&gt;The contract will be parameterized by the length of the campaign in days, the goal amount, and the percentage payoff to participants if the goal is not attained.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DominantAssuranceContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;percentagePayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_percentagePayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;percentagePayoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_percentagePayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The smart contract will track a few simple values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;totalPledges&lt;/code&gt; will track the total amount pledged.  In the previous simple assurance contract, I relied on &lt;code&gt;address(this).balance&lt;/code&gt; for tracking pledges, but I can&amp;rsquo;t do that here because the owner must escrow ether for future payoffs, if needed.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;balanceOf&lt;/code&gt; mapping will track the amount of ether to be refunded to accounts &lt;em&gt;in the case of a failed campaign&lt;/em&gt;.  Initially, &lt;code&gt;balanceOf[owner]&lt;/code&gt; will be set to all the escrowed ether transferred when the contract is deployed.  That amount will be decreased as pledges are made.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;pledges&#34;&gt;Pledges&lt;/h2&gt;

&lt;p&gt;The contract accepts pledges and associated ether:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The campaign is over.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The amount is incorrect.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The owner cannot pledge.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;percentagePayoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The contract accounts for the pledged ether by updating both &lt;code&gt;totalPledges&lt;/code&gt; and &lt;code&gt;balanceOf[msg.sender]&lt;/code&gt;.  It also accounts for the implied payoff amount by transferring ether balance from the owner to the sender.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve disallowed pledges from the owner to avoid having to reason about the correctness of &lt;code&gt;balanceOf[owner]&lt;/code&gt; with respect to funding payoffs.  The owner can always pledge from another account if they choose.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s possible for the contract to run out of payoff funds, so the contract avoids an underflow risk by checking the available owner balance.  This risk exists in two scenarios:  when more than the expected amount is pledged, or when insufficient payoff is escrowed.  The former is great news (but needs to be handled), and the latter may be by design as I discuss later.&lt;/p&gt;

&lt;h2 id=&#34;post-campaign&#34;&gt;Post-Campaign&lt;/h2&gt;

&lt;p&gt;The logic for handling post-campaign transfers is exactly the same as in the simple assurance contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimFunds&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The campaign is not over.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The funding goal was not met.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only the owner may claim funds.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getRefund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The campaign is still active.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Funding goal was met.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While the logic is the same, it&amp;rsquo;s actually a bit more subtle with respect to the payoffs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;claimFunds&lt;/code&gt; is simple because all funds, whether pledged or escrowed payoffs, go to the owner when the campaign is successful.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getRefund&lt;/code&gt; is simple because the complicated work of keeping track of the pledges and payoffs is done in &lt;code&gt;pledge&lt;/code&gt;.  Similarly, any remaining/excess escrowed payoff funds will appear in &lt;code&gt;balanceOf[owner]&lt;/code&gt;, which means that the owner can also use &lt;code&gt;getRefund&lt;/code&gt; to claim that excess.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;insufficient-payoff-escrow-feature&#34;&gt;Insufficient Payoff Escrow (Feature)&lt;/h2&gt;

&lt;p&gt;Note that the constructor did &lt;em&gt;not&lt;/em&gt; require the owner to escrow ether sufficient to cover a failed campaign.  Because the storage variables are public, it&amp;rsquo;s trivial to determine the sufficiency of the escrowed ether (in &lt;code&gt;balanceOf[owner]&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This gives patrons the flexibility to deploy a contract with only a partially funded payoff.  This would mean that early pledgers would be entitled to a failure payoff, but late pledgers would not.  That may be an interesting design point for campaigns that want to encourage early pledges.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dominant assurance contracts can easily be implemented with smart contracts.&lt;/li&gt;
&lt;li&gt;The payoff feature presents little extra complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;dominant.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7Cgpjb250cmFjdCBEb21pbmFudEFzc3VyYW5jZUNvbnRyYWN0IHsKICAgIGFkZHJlc3Mgb3duZXI7CiAgICB1aW50MjU2IGRlYWRsaW5lOwogICAgdWludDI1NiBnb2FsOwogICAgdWludDggcGVyY2VudGFnZVBheW9mZjsKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgYmFsYW5jZU9mOwogICAgdWludDI1NiB0b3RhbFBsZWRnZXM7CgogICAgY29uc3RydWN0b3IodWludDI1NiBudW1iZXJPZkRheXMsIHVpbnQyNTYgX2dvYWwsIHVpbnQ4IF9wZXJjZW50YWdlUGF5b2ZmKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgb3duZXIgPSBtc2cuc2VuZGVyOwogICAgICAgIGRlYWRsaW5lID0gbm93ICsgKG51bWJlck9mRGF5cyAqIDEgZGF5cyk7CiAgICAgICAgZ29hbCA9IF9nb2FsOwogICAgICAgIHBlcmNlbnRhZ2VQYXlvZmYgPSBfcGVyY2VudGFnZVBheW9mZjsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPSBtc2cudmFsdWU7CiAgICB9CgogICAgZnVuY3Rpb24gcGxlZGdlKHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShub3cgPCBkZWFkbGluZSwgIlRoZSBjYW1wYWlnbiBpcyBvdmVyLiIpOwogICAgICAgIHJlcXVpcmUobXNnLnZhbHVlID09IGFtb3VudCwgIlRoZSBhbW91bnQgaXMgaW5jb3JyZWN0LiIpOwogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciAhPSBvd25lciwgIlRoZSBvd25lciBjYW5ub3QgcGxlZGdlLiIpOwoKICAgICAgICB1aW50MjU2IHBheW9mZiA9IGFtb3VudCAqIHBlcmNlbnRhZ2VQYXlvZmYgLyAxMDA7CiAgICAgICAgaWYgKHBheW9mZiA&amp;#43;IGJhbGFuY2VPZltvd25lcl0pIHsKICAgICAgICAgICAgcGF5b2ZmID0gYmFsYW5jZU9mW293bmVyXTsKICAgICAgICB9CiAgICAgICAgYmFsYW5jZU9mW293bmVyXSAtPSBwYXlvZmY7CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdICs9IGFtb3VudCtwYXlvZmY7CiAgICAgICAgdG90YWxQbGVkZ2VzICs9IGFtb3VudDsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFpbUZ1bmRzKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG5vdyA&amp;#43;PSBkZWFkbGluZSwgIlRoZSBjYW1wYWlnbiBpcyBub3Qgb3Zlci4iKTsKICAgICAgICByZXF1aXJlKHRvdGFsUGxlZGdlcyA&amp;#43;PSBnb2FsLCAiVGhlIGZ1bmRpbmcgZ29hbCB3YXMgbm90IG1ldC4iKTsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIsICJPbmx5IHRoZSBvd25lciBtYXkgY2xhaW0gZnVuZHMuIik7CgogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYWRkcmVzcyh0aGlzKS5iYWxhbmNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRSZWZ1bmQoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGRlYWRsaW5lLCAiVGhlIGNhbXBhaWduIGlzIHN0aWxsIGFjdGl2ZS4iKTsKICAgICAgICByZXF1aXJlKHRvdGFsUGxlZGdlcyA8IGdvYWwsICJGdW5kaW5nIGdvYWwgd2FzIG1ldC4iKTsKCiAgICAgICAgdWludDI1NiBhbW91bnQgPSBiYWxhbmNlT2ZbbXNnLnNlbmRlcl07CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9Cn0K&#34; download=&#39;dominant.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DominantAssuranceContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;percentagePayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_percentagePayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;percentagePayoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_percentagePayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The campaign is over.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The amount is incorrect.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The owner cannot pledge.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;percentagePayoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimFunds&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The campaign is not over.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The funding goal was not met.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Only the owner may claim funds.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getRefund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;The campaign is still active.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalPledges&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Funding goal was met.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Avoiding Integer Overflows: SafeMath Isn&#39;t Enough</title>
      <link>https://programtheblockchain.com/posts/2018/04/27/avoiding-integer-overflows-safemath-isnt-enough/</link>
      <pubDate>Fri, 27 Apr 2018 12:20:05 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/27/avoiding-integer-overflows-safemath-isnt-enough/</guid>
      <description>&lt;p&gt;This post describes what an integer overflow is and how to avoid them in smart contracts.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;what-is-an-integer-overflow&#34;&gt;What is an Integer Overflow?&lt;/h2&gt;

&lt;p&gt;Fixed-size integers have a range of values they can represent. For example, an 8-bit unsigned integer can store values between 0 and 255 (2&lt;sup&gt;8&lt;/sup&gt;-1). When the result of some arithmetic falls outside that supported range, an &lt;a href=&#34;https://en.wikipedia.org/wiki/Integer_overflow&#34;&gt;integer overflow&lt;/a&gt; occurs. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;On the Ethereum Virtual Machine (EVM), the consequence of an integer overflow is that the most significant bits of the result are lost. For example, when working with 8-bit unsigned integers, &lt;code&gt;255 + 1 = 0&lt;/code&gt;. This is easier to see in binary, where &lt;code&gt;1111 1111 + 0000 0001&lt;/code&gt; &lt;em&gt;should&lt;/em&gt; be &lt;code&gt;1 0000 0000&lt;/code&gt;, but because only 8 bits are available, the leftmost bit is lost, resulting in a value of &lt;code&gt;0000 0000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Intuitively, the effect of an integer overflow can be thought of as the value &amp;ldquo;wrapping around.&amp;rdquo;&lt;/p&gt;

&lt;h2 id=&#34;examples-of-integer-overflows&#34;&gt;Examples of Integer Overflows&lt;/h2&gt;

&lt;p&gt;Solidity uses fixed-size integers of various sizes. In the examples below, I&amp;rsquo;ve used only 256-bit integers, the largest integer types Solidity supports. Integer overflow in the EVM can occur during addition, subtraction, multiplication, and exponentiation.&lt;/p&gt;

&lt;h3 id=&#34;unsigned-integer-overflows&#34;&gt;Unsigned Integer Overflows&lt;/h3&gt;

&lt;p&gt;256-bit unsigned integers can store a minimum value of 0 and a maximum value of 2&lt;sup&gt;256&lt;/sup&gt;-1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;                    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// range: [0, 2**256)&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;           &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be 2**256&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be -1&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;           &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be 2**256&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;128&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;u&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be 2**256&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;signed-integer-overflows&#34;&gt;Signed Integer Overflows&lt;/h3&gt;

&lt;p&gt;256-bit signed integers can store a minimum value of -2&lt;sup&gt;255&lt;/sup&gt; and a maximum value of 2&lt;sup&gt;255&lt;/sup&gt;-1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;int256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;                     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// range: [-2**255, 2**255)&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be 2**255&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be -2**255-1&lt;/span&gt;

&lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;254&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// should be 2**255&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;mitigating-integer-overflows&#34;&gt;Mitigating Integer Overflows&lt;/h2&gt;

&lt;p&gt;Unlike some computer architectures, the EVM provides no indication that an overflow has occurred. It&amp;rsquo;s up to you to write code that detects overflow conditions and handles them appropriately.&lt;/p&gt;

&lt;p&gt;One approach to integer overflows is to perform the arithmetic, check the result, and revert the transaction if an overflow occurred. For example, here&amp;rsquo;s a &lt;code&gt;safeAdd&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;safeAdd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If an integer overflow occurred, then &lt;code&gt;c&lt;/code&gt; will be less than &lt;code&gt;a&lt;/code&gt;, and the &lt;code&gt;require&lt;/code&gt; will revert the transaction.&lt;/p&gt;

&lt;p&gt;This approach is taken by the widely-used &lt;a href=&#34;https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/math/SafeMath.sol&#34;&gt;&lt;code&gt;SafeMath&lt;/code&gt; library from OpenZeppelin&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;safemath-isn-t-enough&#34;&gt;SafeMath Isn&amp;rsquo;t Enough&lt;/h2&gt;

&lt;p&gt;Using functions like those provided in the &lt;code&gt;SafeMath&lt;/code&gt; library ensure that your contract doesn&amp;rsquo;t &lt;em&gt;use&lt;/em&gt; the result of an integer overflow, but they might leave your contract unusable. Here&amp;rsquo;s a simple example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SafeMath&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;ether&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;quantity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;200&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;purchase&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mul&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;quantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Because 2 ether * 2&lt;sup&gt;200&lt;/sup&gt; overflows, the call to &lt;code&gt;mul&lt;/code&gt; will always revert the transaction, so no purchase can be made.&lt;/p&gt;

&lt;p&gt;We recently encountered this difficulty in our post about &lt;a href=&#34;https://programtheblockchain.com/posts/2018/04/24/writing-a-periodic-loan-contract/&#34;&gt;periodic loans&lt;/a&gt;. This code in &lt;code&gt;calculateCollateral&lt;/code&gt; is roughly equivalent to &lt;code&gt;SafeMath&lt;/code&gt;&amp;rsquo;s &lt;code&gt;mul&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;payment causes overflow&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is a good mitigation, but there&amp;rsquo;s still a problem. There&amp;rsquo;s a required minimum payment. If &lt;em&gt;that&lt;/em&gt; payment causes an overflow, then there&amp;rsquo;s no way to pay off the loan. To avoid this situation, we added an overflow check to the constructor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;minimumPayment * collateralPerPayment overflows&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The result of the multiplication isn&amp;rsquo;t used. The check is purely there to ensure that the contract cannot be deployed with parameters that will render it unusable.&lt;/p&gt;

&lt;h2 id=&#34;batchoverflow&#34;&gt;batchOverflow&lt;/h2&gt;

&lt;p&gt;Making its rounds this week is an integer overflow bug that has been dubbed &amp;ldquo;&lt;a href=&#34;https://medium.com/@peckshield/alert-new-batchoverflow-bug-in-multiple-erc20-smart-contracts-cve-2018-10299-511067db6536&#34;&gt;batchOverflow&lt;/a&gt;.&amp;rdquo; The following is a slight simplification of the erroneous code found in several ERC20 token contracts. This function allows a token holder to send tokens to multiple recipients:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// DO NOT USE!&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;batchTransfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receivers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receivers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sub&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;receivers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;receivers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;receivers&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;require&lt;/code&gt; is meant to ensure the sender has a sufficient balance to cover the transfers, but note that &lt;code&gt;amount&lt;/code&gt; is the product of two values controlled by the caller. If someone were to pass 2 addresses and a &lt;code&gt;value&lt;/code&gt; of 2&lt;sup&gt;255&lt;/sup&gt;, then &lt;code&gt;amount&lt;/code&gt; would overflow to 0. The &lt;code&gt;require&lt;/code&gt; would verify that the sender&amp;rsquo;s balance was at least 0, and the recipients&amp;rsquo; token balances would be increased.&lt;/p&gt;

&lt;p&gt;Note that the use of &lt;code&gt;SafeMath&lt;/code&gt;&amp;rsquo;s &lt;code&gt;sub&lt;/code&gt; to reduce the sender&amp;rsquo;s balance doesn&amp;rsquo;t help here because &lt;code&gt;amount&lt;/code&gt; is 0, so that subtraction has no overflow.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arithmetic using fixed-sized integers can cause overflows, resulting in mathematically incorrect results.&lt;/li&gt;
&lt;li&gt;To abort overflows, use a library like &lt;a href=&#34;https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/math/SafeMath.sol&#34;&gt;&lt;code&gt;SafeMath&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To avoid overflows altogether, do parameter validation up front.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;test-your-knowledge&#34;&gt;Test Your Knowledge&lt;/h2&gt;

&lt;p&gt;Now that you understand integer overflows and how to spot them, test your knowledge in the &lt;a href=&#34;https://capturetheether.com/challenges/math/&#34;&gt;Capture the Ether &amp;ldquo;math&amp;rdquo; category&lt;/a&gt;. More than one of those challenges requires exploiting an integer overflow.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;Sometimes the term &amp;ldquo;integer &lt;em&gt;underflow&lt;/em&gt;&amp;rdquo; is used when the result is specifically below the supported range.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Periodic Loan Contract</title>
      <link>https://programtheblockchain.com/posts/2018/04/24/writing-a-periodic-loan-contract/</link>
      <pubDate>Tue, 24 Apr 2018 05:28:18 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/24/writing-a-periodic-loan-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a smart contract that will administer an ether loan while holding ERC20 tokens as collateral.  My previous post on
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;a collateralized loan contract&lt;/a&gt;
assumed that there would be just a single loan payment.  This post will generalize that to a more typical structure where the loan requires equal payments at regularly-spaced intervals at a fixed interest rate.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Periodic loans are characterized by a few simple values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The remaining principal &lt;em&gt;balance&lt;/em&gt; amount, which represents the amount of borrowed ether that remains owed to the lender.  This typically decreases with each loan payment.  This begins as the original loan amount.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;period&lt;/em&gt; (or interval) between required loan payments.  A typical period might be 30 days.&lt;/li&gt;
&lt;li&gt;The minimum periodic &lt;em&gt;payment&lt;/em&gt; amount, which is the amount of ether the borrower is required to transfer to the lender each pay period.  (The last payment may be less than the minimum.)&lt;/li&gt;
&lt;li&gt;The per-period &lt;em&gt;interest rate&lt;/em&gt;, which is the fraction of the loan balance that is owed as &lt;em&gt;interest&lt;/em&gt; each pay period.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Collateral&lt;/em&gt; tokens that will be forfeited for each missed payment.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PeriodicLoan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRateNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRateDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;interestRate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interestRateNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRateDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;minimumPayment * collateralPerPayment overflows&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more yet to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above is very similar to the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;collateralized loan contract&lt;/a&gt;
with the addition of the interest rate, payment amount, and payment period values.&lt;/p&gt;

&lt;p&gt;Note also that the creation of this loan contract, the transfer of tokens to the loan contract, and the transfer of ether to the borrower will be done by a different smart contract.  This contract will assume that those amounts were correctly transferred.  (Here is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Mortgage_calculator&#34;&gt;Wikipedia page&lt;/a&gt; with useful formulas for loan payments.)&lt;/p&gt;

&lt;h2 id=&#34;loan-payments&#34;&gt;Loan Payments&lt;/h2&gt;

&lt;p&gt;Loan payments consist of an interest component and a principal component, which can be computed simply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;interest&lt;/em&gt; = &lt;em&gt;interest rate&lt;/em&gt; * &lt;em&gt;balance&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;principal&lt;/em&gt; = &lt;em&gt;payment&lt;/em&gt; &amp;ndash; &lt;em&gt;interest&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;new balance&lt;/em&gt; = &lt;em&gt;old balance&lt;/em&gt; &amp;ndash; &lt;em&gt;principal&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;collateral&#34;&gt;Collateral&lt;/h2&gt;

&lt;p&gt;Periodic loans in the physical world typically have one big indivisible chunk of collateral like a car or house.  In that world, loans must be very complicated to deal with penalties for missed payments including the possibility of forfeiting the collateral for delinquency.  Fortunately, we can avoid all of that complexity when tokens are used as collateral in a smart contract.&lt;/p&gt;

&lt;p&gt;In the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;collateralized loan contract&lt;/a&gt;
all the tokens were transferred at once.  If the one loan payment was made, then all of the tokens were transferred back to the borrower, but they were all forfeited if the loan payment wasn&amp;rsquo;t made.  I will generalize that idea.&lt;/p&gt;

&lt;p&gt;In the periodic loan, each pay period will result in a transfer of a fraction of the collateral tokens.  If the payment was made correctly, then some tokens will be returned to the borrower.  Otherwise, they will be transferred to the lender.&lt;/p&gt;

&lt;p&gt;The amount of collateral to transfer is easy to compute.  The loan is parameterized with &lt;code&gt;collateralPerPayment&lt;/code&gt;, which represents the amount of collateral that will be returned or forfeited based on a &lt;code&gt;minimumPayment&lt;/code&gt;.  If the borrower pays an amount different than the minimum, the amount of collateral returned is adjusted proportionally.  For instance, paying twice the minimum will result in twice as many tokens returned.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateComponents&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateCollateral&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;payment causes overflow&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;payment-processing&#34;&gt;Payment Processing&lt;/h2&gt;

&lt;p&gt;There is a symmetry between accepting loan payments and handling missed payments.  In both cases, there is an adjustment to the remaining principal balance and a corresponding transfer of tokens.  The only difference is that the tokens are returned to the borrower after a payment, but they are forfeited to the lender after a missed payment.  Both also advance the due date of the next payment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;processPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateCollateral&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Please note that the code above does the token transfer last, which follows the Checks-Effects-Interactions pattern to avoid potential reentrancy vulnerabilities.&lt;/p&gt;

&lt;h2 id=&#34;accepting-payments&#34;&gt;Accepting Payments&lt;/h2&gt;

&lt;p&gt;Given the ability to compute interest, principal, and collateral amounts corresponding to any expected payment, we are most of the way to handling loan payments.  The only additional consideration is the need to handle the final loan payment.  While it&amp;rsquo;s possible to create loan terms where all payments will be identical, it&amp;rsquo;s sometimes convenient to have &amp;ldquo;round&amp;rdquo; payments&amp;mdash;like exactly 1 ETH&amp;mdash;and then have the final payment be some fractional amount.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;makePayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculatePrincipal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;processPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above does just a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It checks that the payment was made on time.&lt;/li&gt;
&lt;li&gt;It computes the principal amount that corresponds to the payment.&lt;/li&gt;
&lt;li&gt;It checks that the principal does not exceed the remaining balance because this would amount to a gift to the lender.&lt;/li&gt;
&lt;li&gt;It does &lt;em&gt;not&lt;/em&gt; special case the odd final payment amount other than relaxing the &lt;code&gt;require&lt;/code&gt; statement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;processPeriod&lt;/code&gt; is called specifying that the borrower should receive the collateral tokens.&lt;/li&gt;
&lt;li&gt;The code does &lt;em&gt;not&lt;/em&gt; transfer the ether directly to avoid problems with a misbehaving lender.  Instead, the lender can withdraw ether at any time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;missed-payments&#34;&gt;Missed Payments&lt;/h2&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;missedPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculatePrincipal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;processPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code for handling a missed payment is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code computes the principal component of the missed payment.  This assumes the payment was the minimum amount, which is true for all but, possibly, the last payment.  The conditional handles the boundary condition when the principal remaining is less than the principal component of a minimum payment.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;processPeriod&lt;/code&gt; is called specifying the lender as the recipient of the forfeited tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;missedPayment&lt;/code&gt; can be called by anybody.  This is important to the &lt;em&gt;borrower&lt;/em&gt; because they may need to call &lt;code&gt;missedPayment&lt;/code&gt; in order to advance &lt;code&gt;dueDate&lt;/code&gt; in order to make a subsequent payment.&lt;/p&gt;

&lt;h2 id=&#34;excess-collateral&#34;&gt;Excess Collateral&lt;/h2&gt;

&lt;p&gt;This smart contract allows borrowers to pay more than the minimum, which will ultimately lead to less total paid because of avoided interest.  If used, this feature will lead to excess collateral owned by the loan contract after it&amp;rsquo;s been fully paid off.  This collateral belongs to the borrower.  The simplest way to handle that is to allow excess tokens to be claimed when the &lt;code&gt;remainingBalance&lt;/code&gt; is zero:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;returnCollateral&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;keeping-it-simple&#34;&gt;Keeping It Simple&lt;/h2&gt;

&lt;p&gt;In the spirit of &lt;a href=&#34;https://programtheblockchain.com/posts/2018/04/17/keep-your-code-simple/&#34;&gt;keeping it simple&lt;/a&gt;, this contract makes one huge simplifying assumption.  Did you see it?&lt;/p&gt;

&lt;p&gt;How does this contract handle the borrower missing multiple payments in a row?  It does nothing special!  If &lt;em&gt;N&lt;/em&gt; payments are missed in a row, then &lt;code&gt;missedPayment&lt;/code&gt; must be called &lt;em&gt;N&lt;/em&gt; times before the contract will accept another payment.  Sure, the astute reader could probably add a loop somewhere to handle this case, but then they&amp;rsquo;d have to think hard about the correctness of that loop.  Loop correctness is hard, but I didn&amp;rsquo;t have to think (much) to be sure the current code works!&lt;/p&gt;

&lt;h2 id=&#34;interesting-variations&#34;&gt;Interesting Variations&lt;/h2&gt;

&lt;p&gt;One of the nice things about smart contracts is that they enable interesting variations on traditional models by simply implementing the variation in the code of the contract.  The contract above represents a pretty traditional multi-period loan with respect to payment structure and interest computations.  (The only novel aspect is the returning of fractions of the collateral with each payment, which is enabled by the typical design of ERC20 tokens.)&lt;/p&gt;

&lt;p&gt;Variations that would represent modest changes to this contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rather than having a minimum payment, the contract could require a minimum amount of principal above the interest due.&lt;/li&gt;
&lt;li&gt;The contract could add a penalty amount to the principal balance for each missed payment (in addition to forfeiting collateral tokens).&lt;/li&gt;
&lt;li&gt;The contract could include a grace period during which a late payment is accepted with a small penalty, but no forfeited collateral.&lt;/li&gt;
&lt;li&gt;The contract could disallow payments in excess of the payment amount, which would disallow pre-payment of principal balance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Smart contracts can implement loans that require multiple payments.&lt;/li&gt;
&lt;li&gt;ERC20 token collateral enable a flexible repayment and forfeiture policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-full-contract&#34;&gt;The Full Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;periodicloan.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjM7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IFBlcmlvZGljTG9hbiB7CiAgICBzdHJ1Y3QgUmF0aW9uYWwgewogICAgICAgIHVpbnQyNTYgbnVtZXJhdG9yOwogICAgICAgIHVpbnQyNTYgZGVub21pbmF0b3I7CiAgICB9CgogICAgYWRkcmVzcyBsZW5kZXI7CiAgICBhZGRyZXNzIGJvcnJvd2VyOwoKICAgIFJhdGlvbmFsIHB1YmxpYyBpbnRlcmVzdFJhdGU7CgogICAgdWludDI1NiBwdWJsaWMgZHVlRGF0ZTsKICAgIHVpbnQyNTYgcGF5bWVudFBlcmlvZDsKCiAgICB1aW50MjU2IHB1YmxpYyByZW1haW5pbmdCYWxhbmNlOwogICAgdWludDI1NiBtaW5pbXVtUGF5bWVudDsKCiAgICBJRVJDMjBUb2tlbiB0b2tlbjsKICAgIHVpbnQyNTYgY29sbGF0ZXJhbFBlclBheW1lbnQ7CgogICAgY29uc3RydWN0b3IoCiAgICAgICAgYWRkcmVzcyBfbGVuZGVyLAogICAgICAgIGFkZHJlc3MgX2JvcnJvd2VyLAogICAgICAgIHVpbnQyNTYgaW50ZXJlc3RSYXRlTnVtZXJhdG9yLAogICAgICAgIHVpbnQyNTYgaW50ZXJlc3RSYXRlRGVub21pbmF0b3IsCiAgICAgICAgdWludDI1NiBfcGF5bWVudFBlcmlvZCwKICAgICAgICB1aW50MjU2IF9taW5pbXVtUGF5bWVudCwKICAgICAgICB1aW50MjU2IHByaW5jaXBhbCwKICAgICAgICBJRVJDMjBUb2tlbiBfdG9rZW4sCiAgICAgICAgdWludDI1NiB1bml0cwogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIGxlbmRlciA9IF9sZW5kZXI7CiAgICAgICAgYm9ycm93ZXIgPSBfYm9ycm93ZXI7CiAgICAgICAgaW50ZXJlc3RSYXRlID0gUmF0aW9uYWwoaW50ZXJlc3RSYXRlTnVtZXJhdG9yLCBpbnRlcmVzdFJhdGVEZW5vbWluYXRvcik7CiAgICAgICAgcGF5bWVudFBlcmlvZCA9IF9wYXltZW50UGVyaW9kOwogICAgICAgIG1pbmltdW1QYXltZW50ID0gX21pbmltdW1QYXltZW50OwogICAgICAgIHJlbWFpbmluZ0JhbGFuY2UgPSBwcmluY2lwYWw7CiAgICAgICAgdG9rZW4gPSBfdG9rZW47CiAgICAgICAgY29sbGF0ZXJhbFBlclBheW1lbnQgPSB1bml0czsKCiAgICAgICAgdWludDI1NiB4ID0gbWluaW11bVBheW1lbnQgKiBjb2xsYXRlcmFsUGVyUGF5bWVudDsKICAgICAgICByZXF1aXJlKHggLyBjb2xsYXRlcmFsUGVyUGF5bWVudCA9PSBtaW5pbXVtUGF5bWVudCwKICAgICAgICAgICAgIm1pbmltdW1QYXltZW50ICogY29sbGF0ZXJhbFBlclBheW1lbnQgb3ZlcmZsb3dzIik7CgogICAgICAgIGR1ZURhdGUgPSBub3cgKyBwYXltZW50UGVyaW9kOwogICAgfQoKICAgIGZ1bmN0aW9uIG11bHRpcGx5KHVpbnQyNTYgeCwgUmF0aW9uYWwgcikgaW50ZXJuYWwgcHVyZSByZXR1cm5zICh1aW50MjU2KSB7CiAgICAgICAgcmV0dXJuIHggKiByLm51bWVyYXRvciAvIHIuZGVub21pbmF0b3I7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9uZW50cyh1aW50MjU2IGFtb3VudCkKICAgICAgICBpbnRlcm5hbAogICAgICAgIHZpZXcKICAgICAgICByZXR1cm5zICh1aW50MjU2IGludGVyZXN0LCB1aW50MjU2IHByaW5jaXBhbCkKICAgIHsKICAgICAgICBpbnRlcmVzdCA9IG11bHRpcGx5KHJlbWFpbmluZ0JhbGFuY2UsIGludGVyZXN0UmF0ZSk7CiAgICAgICAgcmVxdWlyZShhbW91bnQgPj0gaW50ZXJlc3QpOwogICAgICAgIHByaW5jaXBhbCA9IGFtb3VudCAtIGludGVyZXN0OwogICAgICAgIHJldHVybiAoaW50ZXJlc3QsIHByaW5jaXBhbCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY3VsYXRlQ29sbGF0ZXJhbCh1aW50MjU2IHBheW1lbnQpCiAgICAgICAgaW50ZXJuYWwKICAgICAgICB2aWV3CiAgICAgICAgcmV0dXJucyAodWludDI1NiB1bml0cykKICAgIHsKICAgICAgICB1aW50MjU2IHByb2R1Y3QgPSBjb2xsYXRlcmFsUGVyUGF5bWVudCAqIHBheW1lbnQ7CiAgICAgICAgcmVxdWlyZShwcm9kdWN0IC8gY29sbGF0ZXJhbFBlclBheW1lbnQgPT0gcGF5bWVudCwgInBheW1lbnQgY2F1c2VzIG92ZXJmbG93Iik7CiAgICAgICAgdW5pdHMgPSBwcm9kdWN0IC8gbWluaW11bVBheW1lbnQ7CiAgICAgICAgcmV0dXJuIHVuaXRzOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb2Nlc3NQZXJpb2QodWludDI1NiBpbnRlcmVzdCwgdWludDI1NiBwcmluY2lwYWwsIGFkZHJlc3MgcmVjaXBpZW50KSBpbnRlcm5hbCB7CiAgICAgICAgdWludDI1NiB1bml0cyA9IGNhbGN1bGF0ZUNvbGxhdGVyYWwoaW50ZXJlc3QrcHJpbmNpcGFsKTsKCiAgICAgICAgcmVtYWluaW5nQmFsYW5jZSAtPSBwcmluY2lwYWw7CgogICAgICAgIGR1ZURhdGUgKz0gcGF5bWVudFBlcmlvZDsKCiAgICAgICAgcmVxdWlyZSh0b2tlbi50cmFuc2ZlcihyZWNpcGllbnQsIHVuaXRzKSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWFrZVBheW1lbnQoKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShub3cgPD0gZHVlRGF0ZSk7CgogICAgICAgIHVpbnQyNTYgaW50ZXJlc3Q7CiAgICAgICAgdWludDI1NiBwcmluY2lwYWw7CiAgICAgICAgKGludGVyZXN0LCBwcmluY2lwYWwpID0gY2FsY3VsYXRlQ29tcG9uZW50cyhtc2cudmFsdWUpOwoKICAgICAgICByZXF1aXJlKHByaW5jaXBhbCA8PSByZW1haW5pbmdCYWxhbmNlKTsKICAgICAgICByZXF1aXJlKG1zZy52YWx1ZSA&amp;#43;PSBtaW5pbXVtUGF5bWVudCB8fCBwcmluY2lwYWwgPT0gcmVtYWluaW5nQmFsYW5jZSk7CgogICAgICAgIHByb2Nlc3NQZXJpb2QoaW50ZXJlc3QsIHByaW5jaXBhbCwgYm9ycm93ZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHdpdGhkcmF3KCkgcHVibGljIHsKICAgICAgICBsZW5kZXIudHJhbnNmZXIoYWRkcmVzcyh0aGlzKS5iYWxhbmNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtaXNzZWRQYXltZW50KCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG5vdyA&amp;#43;IGR1ZURhdGUpOwoKICAgICAgICB1aW50MjU2IGludGVyZXN0OwogICAgICAgIHVpbnQyNTYgcHJpbmNpcGFsOwogICAgICAgIChpbnRlcmVzdCwgcHJpbmNpcGFsKSA9IGNhbGN1bGF0ZUNvbXBvbmVudHMobWluaW11bVBheW1lbnQpOwoKICAgICAgICBpZiAocHJpbmNpcGFsID4gcmVtYWluaW5nQmFsYW5jZSkgewogICAgICAgICAgICBwcmluY2lwYWwgPSByZW1haW5pbmdCYWxhbmNlOwogICAgICAgIH0KCiAgICAgICAgcHJvY2Vzc1BlcmlvZChpbnRlcmVzdCwgcHJpbmNpcGFsLCBsZW5kZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJldHVybkNvbGxhdGVyYWwoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUocmVtYWluaW5nQmFsYW5jZSA9PSAwKTsKCiAgICAgICAgdWludDI1NiBhbW91bnQgPSB0b2tlbi5iYWxhbmNlT2YodGhpcyk7CiAgICAgICAgcmVxdWlyZSh0b2tlbi50cmFuc2Zlcihib3Jyb3dlciwgYW1vdW50KSk7CiAgICB9Cn0K&#34; download=&#39;periodicloan.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PeriodicLoan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRateNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRateDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;interestRate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interestRateNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRateDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;minimumPayment * collateralPerPayment overflows&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateComponents&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interestRate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateCollateral&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralPerPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;payment causes overflow&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;product&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;processPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateCollateral&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;paymentPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;makePayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateComponents&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;processPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;missedPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;calculateComponents&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;minimumPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;processPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;interest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;principal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;returnCollateral&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;remainingBalance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Storage Patterns: Pagination</title>
      <link>https://programtheblockchain.com/posts/2018/04/20/storage-patterns-pagination/</link>
      <pubDate>Fri, 20 Apr 2018 09:21:02 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/20/storage-patterns-pagination/</guid>
      <description>&lt;p&gt;This post will show how to support pagination for returning large data sets from a smart contract. It builds on concepts introduced in my post on &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/30/storage-patterns-doubly-linked-list/&#34;&gt;doubly-linked lists&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;when-to-paginate&#34;&gt;When to Paginate&lt;/h2&gt;

&lt;p&gt;When large amounts of data are involved, it may not be possible for a smart contract to return an entire data set at once. Pagination is a way for a caller to make multiple smaller requests to retrieve the data. Some callers may not need the entire data set, in which case it&amp;rsquo;s useful to be able to retrieve a subset.&lt;/p&gt;

&lt;p&gt;There are two potential limits to how much data a smart contract can return at once: gas limits and execution time. For a function call that&amp;rsquo;s part of a transaction (e.g. from another smart contract), gas is often a limiting factor. Each byte of data returned from the call consumes gas, as does iterating through the data set. Even if the caller is willing to supply a huge amount of gas, there is a &lt;em&gt;block gas limit&lt;/em&gt;, which is the maximum amount of gas a single block can consume. If a transaction exceeds this limit, it can never be mined into a block.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;view&lt;/code&gt; functions being called from outside the EVM (e.g. from JavaScript in a web app), gas is &lt;em&gt;not&lt;/em&gt; a limiting factor because there is no transaction being executed. The node processing the call does the computation locally and returns the result. Each node gets to set its own processing limits&amp;mdash;typically limiting &lt;em&gt;execution time&lt;/em&gt;. If the call takes too long, it will fail.&lt;/p&gt;

&lt;p&gt;When a data set may be large enough to approach either of these limits, use pagination.&lt;/p&gt;

&lt;h2 id=&#34;using-cursors&#34;&gt;Using Cursors&lt;/h2&gt;

&lt;p&gt;There are many valid API designs for pagination, but using a cursor is probably the most flexible. When a client requests a page of data, the server&amp;mdash;in this case a smart contract&amp;mdash;returns the requested data as well as a &lt;em&gt;cursor&lt;/em&gt;. The cursor is an opaque value that the client needs to pass in its next request. This opaque value specifies where enumeration should continue.&lt;/p&gt;

&lt;h2 id=&#34;paging-through-an-array&#34;&gt;Paging Through an Array&lt;/h2&gt;

&lt;p&gt;The following code supports appending to an array and enumerating that array using a very simple cursor: the index of the first item being requested.&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;arraypagination.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjI7Cgpjb250cmFjdCBBcnJheVBhZ2luYXRpb24gewogICAgYnl0ZXMzMltdIGFycjsKCiAgICBmdW5jdGlvbiBhZGQoYnl0ZXMzMiBkYXRhKSBwdWJsaWMgewogICAgICAgIGFyci5wdXNoKGRhdGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZldGNoUGFnZSh1aW50MjU2IGN1cnNvciwgdWludDI1NiBob3dNYW55KQogICAgcHVibGljCiAgICB2aWV3CiAgICByZXR1cm5zIChieXRlczMyW10gdmFsdWVzLCB1aW50MjU2IG5ld0N1cnNvcikKICAgIHsKICAgICAgICB1aW50MjU2IGxlbmd0aCA9IGhvd01hbnk7CiAgICAgICAgaWYgKGxlbmd0aCA&amp;#43;IGFyci5sZW5ndGggLSBjdXJzb3IpIHsKICAgICAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aCAtIGN1cnNvcjsKICAgICAgICB9CgogICAgICAgIHZhbHVlcyA9IG5ldyBieXRlczMyW10obGVuZ3RoKTsKICAgICAgICBmb3IgKHVpbnQyNTYgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YWx1ZXNbaV0gPSBhcnJbY3Vyc29yICsgaV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKHZhbHVlcywgY3Vyc29yICsgbGVuZ3RoKTsKICAgIH0KfQo=&#34; download=&#39;arraypagination.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;22&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ArrayPagination&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;arr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;fetchPage&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;howMany&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newCursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;howMany&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[](&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;++)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arr&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Here&amp;rsquo;s a brief explanation of the &lt;code&gt;fetchPage&lt;/code&gt; function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;howMany&lt;/code&gt; indicates how many items should be returned. If there aren&amp;rsquo;t enough remaining items in the array, the function will return fewer items.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cursor&lt;/code&gt; is the aforementioned cursor. It simply indicates the starting index for enumeration. The first call should pass &lt;code&gt;0&lt;/code&gt;, and subsequent calls should pass the returned &lt;code&gt;newCursor&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;cursor&lt;/code&gt; is outside the bounds of the array, the array access will throw an error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the array example, the cursor is just an index into the array. The client &lt;em&gt;could&lt;/em&gt; ignore the returned &lt;code&gt;newCursor&lt;/code&gt; and simply calculate the right cursor by counting how many items it had already received. In the next section, I&amp;rsquo;ll show an example where this is not the case, and the cursor truly needs to be returned from the smart contract.&lt;/p&gt;

&lt;h2 id=&#34;paging-through-a-linked-list&#34;&gt;Paging Through a Linked List&lt;/h2&gt;

&lt;p&gt;In a linked list, each node stores a link to the next node in the list. There is no way to jump straight to the &lt;em&gt;n&lt;/em&gt;&lt;sup&gt;th&lt;/sup&gt; item in the list. In my post about &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/30/storage-patterns-doubly-linked-list/&#34;&gt;doubly-linked lists in Solidity&lt;/a&gt;, I built a doubly-linked list where nodes are stored in an array, and the node&amp;rsquo;s index in the array is its unique identifier. This means it&amp;rsquo;s possible to directly access a node by ID.&lt;/p&gt;

&lt;p&gt;A node&amp;rsquo;s ID a good candidate for a cursor. When a page is requested, the returned cursor will be the ID of the &lt;em&gt;next&lt;/em&gt; node in the list (the first node the client has not yet seen).&lt;/p&gt;

&lt;p&gt;The following code is adapted from the &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/30/storage-patterns-doubly-linked-list/&#34;&gt;doubly-linked list post&lt;/a&gt; but with one small change. Instead of using &lt;code&gt;bytes&lt;/code&gt; as the payload type, I&amp;rsquo;ve used &lt;code&gt;bytes32&lt;/code&gt;.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; The last function, &lt;code&gt;fetchPage&lt;/code&gt;, is new:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;doublylinkedlistpagination.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjI7Cgpjb250cmFjdCBEb3VibHlMaW5rZWRMaXN0UGFnaW5hdGlvbiB7CiAgICBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgYnl0ZXMzMiBkYXRhOwogICAgICAgIHVpbnQyNTYgcHJldjsKICAgICAgICB1aW50MjU2IG5leHQ7CiAgICB9CgogICAgLy8gbm9kZXNbMF0ubmV4dCBpcyBoZWFkLCBhbmQgbm9kZXNbMF0ucHJldiBpcyB0YWlsLgogICAgTm9kZVtdIHB1YmxpYyBub2RlczsKCiAgICBjb25zdHJ1Y3RvciAoKSBwdWJsaWMgewogICAgICAgIC8vIHNlbnRpbmVsCiAgICAgICAgbm9kZXMucHVzaChOb2RlKGJ5dGVzMzIoMCksIDAsIDApKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNlcnRBZnRlcih1aW50MjU2IGlkLCBieXRlczMyIGRhdGEpCiAgICBwdWJsaWMKICAgIHJldHVybnMgKHVpbnQyNTYgbmV3SUQpCiAgICB7CiAgICAgICAgLy8gMCBpcyBhbGxvd2VkIGhlcmUgdG8gaW5zZXJ0IGF0IHRoZSBiZWdpbm5pbmcuCiAgICAgICAgcmVxdWlyZShpZCA9PSAwIHx8IGlzVmFsaWROb2RlKGlkKSk7CgogICAgICAgIE5vZGUgc3RvcmFnZSBub2RlID0gbm9kZXNbaWRdOwoKICAgICAgICBub2Rlcy5wdXNoKE5vZGUoewogICAgICAgICAgICBkYXRhOiBkYXRhLAogICAgICAgICAgICBwcmV2OiBpZCwKICAgICAgICAgICAgbmV4dDogbm9kZS5uZXh0CiAgICAgICAgfSkpOwoKICAgICAgICBuZXdJRCA9IG5vZGVzLmxlbmd0aCAtIDE7CgogICAgICAgIG5vZGVzW25vZGUubmV4dF0ucHJldiA9IG5ld0lEOwogICAgICAgIG5vZGUubmV4dCA9IG5ld0lEOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2VydEJlZm9yZSh1aW50MjU2IGlkLCBieXRlczMyIGRhdGEpCiAgICBwdWJsaWMKICAgIHJldHVybnMgKHVpbnQyNTYgbmV3SUQpCiAgICB7CiAgICAgICAgcmV0dXJuIGluc2VydEFmdGVyKG5vZGVzW2lkXS5wcmV2LCBkYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmUodWludDI1NiBpZCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKGlzVmFsaWROb2RlKGlkKSk7CgogICAgICAgIE5vZGUgc3RvcmFnZSBub2RlID0gbm9kZXNbaWRdOwoKICAgICAgICBub2Rlc1tub2RlLm5leHRdLnByZXYgPSBub2RlLnByZXY7CiAgICAgICAgbm9kZXNbbm9kZS5wcmV2XS5uZXh0ID0gbm9kZS5uZXh0OwoKICAgICAgICBkZWxldGUgbm9kZXNbaWRdOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzVmFsaWROb2RlKHVpbnQyNTYgaWQpIGludGVybmFsIHZpZXcgcmV0dXJucyAoYm9vbCkgewogICAgICAgIC8vIDAgaXMgYSBzZW50aW5lbCBhbmQgdGhlcmVmb3JlIGludmFsaWQuCiAgICAgICAgLy8gQSB2YWxpZCBub2RlIGlzIHRoZSBoZWFkIG9yIGhhcyBhIHByZXZpb3VzIG5vZGUuCiAgICAgICAgcmV0dXJuIGlkICE9IDAgJiYgKGlkID09IG5vZGVzWzBdLm5leHQgfHwgbm9kZXNbaWRdLnByZXYgIT0gMCk7CiAgICB9CgogICAgZnVuY3Rpb24gZmV0Y2hQYWdlKHVpbnQyNTYgY3Vyc29yLCB1aW50MjU2IGhvd01hbnkpCiAgICBwdWJsaWMKICAgIHZpZXcKICAgIHJldHVybnMgKGJ5dGVzMzJbXSB2YWx1ZXMsIHVpbnQyNTYgbGVuZ3RoLCB1aW50MjU2IG5ld0N1cnNvcikKICAgIHsKICAgICAgICByZXF1aXJlKGN1cnNvciA9PSAwIHx8IGlzVmFsaWROb2RlKGN1cnNvcikpOwoKICAgICAgICB1aW50MjU2IGN1cnJlbnRJbmRleCA9IGN1cnNvcjsKICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApIHsKICAgICAgICAgICAgLy8gY3Vyc29yID09IDAgbWVhbnMgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0CiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5vZGVzWzBdLm5leHQ7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBhbHdheXMgaGF2ZSBob3dNYW55IGl0ZW1zLCBidXQgdGhleSBtYXkgbm90CiAgICAgICAgLy8gYWxsIGJlIHZhbGlkIGlmIG1vcmUgaXRlbXMgd2VyZSByZXF1ZXN0ZWQgdGhhbiBhcmUgcmVtYWluaW5nIGluIHRoZQogICAgICAgIC8vIGxpc3QuIFRoZSBsZW5ndGggcmV0dXJuIHZhbHVlIHNwZWNpZmllcyBob3cgbXVjaCBvZiB0aGUgcmV0dXJuZWQKICAgICAgICAvLyBhcnJheSBpcyB2YWxpZC4KICAgICAgICB2YWx1ZXMgPSBuZXcgYnl0ZXMzMltdKGhvd01hbnkpOwoKICAgICAgICB1aW50MjU2IGkgPSAwOwogICAgICAgIHdoaWxlIChpIDwgaG93TWFueSAmJiBjdXJyZW50SW5kZXggIT0gMCkgewogICAgICAgICAgICBOb2RlIHN0b3JhZ2Ugbm9kZSA9IG5vZGVzW2N1cnJlbnRJbmRleF07CgogICAgICAgICAgICB2YWx1ZXNbaV0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IG5vZGUubmV4dDsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0KCiAgICAgICAgbGVuZ3RoID0gaTsKICAgICAgICBuZXdDdXJzb3IgPSBjdXJyZW50SW5kZXg7CgogICAgICAgIHJldHVybiAodmFsdWVzLCBsZW5ndGgsIG5ld0N1cnNvcik7CiAgICB9Cn0K&#34; download=&#39;doublylinkedlistpagination.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;22&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DoublyLinkedListPagination&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nodes[0].next is head, and nodes[0].prev is tail.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;constructor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// sentinel&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertAfter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 0 is allowed here to insert at the beginning.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertBefore&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertAfter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remove&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 0 is a sentinel and therefore invalid.&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// A valid node is the head or has a previous node.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;fetchPage&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;howMany&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newCursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// cursor == 0 means the start of the list&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The returned array will always have howMany items, but they may not&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// all be valid if more items were requested than are remaining in the&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// list. The length return value specifies how much of the returned&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// array is valid.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[](&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;howMany&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;howMany&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

            &lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;newCursor&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;currentIndex&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newCursor&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Here&amp;rsquo;s a brief explanation of the &lt;code&gt;fetchPage&lt;/code&gt; function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Like in the array example, &lt;code&gt;fetchPage&lt;/code&gt; accepts parameters &lt;code&gt;cursor&lt;/code&gt; and &lt;code&gt;howMany&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;cursor&lt;/code&gt; of 0 indicates that the client wants to start at the beginning of the list. That means starting at &lt;code&gt;nodes[0].next&lt;/code&gt;, which is the head of the doubly-linked list.&lt;/li&gt;
&lt;li&gt;Arrays kept in memory cannot be resized, so it&amp;rsquo;s necessary to declare their length up front. Before enumeration, it&amp;rsquo;s impossible to know the correct length, so an array of size &lt;code&gt;howMany&lt;/code&gt; is returned along with an extra return value &lt;code&gt;length&lt;/code&gt; that indicates how much of the array is valid data.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;newCursor&lt;/code&gt; return value is the index of the &lt;em&gt;next&lt;/em&gt; node in the list. A client passes that to resume enumeration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;getting-a-consistent-snapshot&#34;&gt;Getting a Consistent Snapshot&lt;/h2&gt;

&lt;p&gt;Pagination often has a downside when it comes to concurrency. It can be difficult for clients to deal with data changing during the course of enumeration. For example, in the linked list case, the node indicated by the cursor could be deleted, making the next call to &lt;code&gt;fetchPage&lt;/code&gt; fail.&lt;/p&gt;

&lt;p&gt;Ethereum provides a nice workaround for these issues. When calling a &lt;code&gt;view&lt;/code&gt; function from client software, it&amp;rsquo;s possible to specify a block number to execute the call in the context of that block. By making each call with the same block number, a client can work with a consistent snapshot of the data.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pagination is necessary when gas or execution time limits prevent a client from reading the entirety of a large data set at once.&lt;/li&gt;
&lt;li&gt;Cursors are a flexible way to support pagination.&lt;/li&gt;
&lt;li&gt;Clients should treat cursors as opaque.&lt;/li&gt;
&lt;li&gt;A cursor should allow enumeration to be resumed efficiently.&lt;/li&gt;
&lt;li&gt;To guarantee a consistent snapshot, clients should consider specifying the same block number for all calls while paging through data.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;Solidity doesn&amp;rsquo;t (without an experimental new encoder) support returning dynamically-sized arrays of dynamically-sized arrays, making a return type of &lt;code&gt;bytes[]&lt;/code&gt; impossible.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Keep Your Code Simple</title>
      <link>https://programtheblockchain.com/posts/2018/04/17/keep-your-code-simple/</link>
      <pubDate>Tue, 17 Apr 2018 08:43:38 -0400</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/17/keep-your-code-simple/</guid>
      <description>&lt;p&gt;This post will explain the importance of writing &lt;em&gt;simple&lt;/em&gt; code in the context of smart contracts, where bugs can be very expensive.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;achieving-correctness&#34;&gt;Achieving Correctness&lt;/h2&gt;

&lt;p&gt;Perhaps it goes without saying, but a bug in a smart contract can have serious consequences. The &lt;a href=&#34;https://mashable.com/2017/11/08/ethereum-parity-bug/&#34;&gt;Parity multisig wallet initialization bug&lt;/a&gt; alone is estimated to have frozen over $150 million dollars worth of ether. The &lt;a href=&#34;https://www.wired.com/2016/06/50-million-hack-just-showed-dao-human/&#34;&gt;DAO hack&lt;/a&gt; put $50 million dollars in jeopardy and led to the creation of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Ethereum_Classic&#34;&gt;Ethereum Classic&lt;/a&gt; fork.&lt;/p&gt;

&lt;p&gt;Anyone who has written code before knows that writing bug-free code is no small feat. One of my favorite quotes about this challenge comes from renowned computer scientist Tony Hoare:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.&lt;/p&gt;
&lt;p&gt;&lt;cite class=&#34;f6 ttu tracked fs-normal&#34;&gt;&amp;ndash;Tony Hoare, 1980&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;the-withdraw-pattern-a-case-study&#34;&gt;The Withdraw Pattern: a Case Study&lt;/h2&gt;

&lt;p&gt;When transferring ether from a smart contract, a common pattern is &amp;ldquo;&lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.21/common-patterns.html#withdrawal-from-contracts&#34;&gt;the withdraw pattern&lt;/a&gt;.&amp;rdquo; Rather than transfer ether immediately, the ether is made available for future withdrawal by the recipient.&lt;/p&gt;

&lt;p&gt;The reason for this pattern is that transfers can fail, and it&amp;rsquo;s a good example of how to simplify your code to avoid bugs. Consider the &lt;code&gt;bid&lt;/code&gt; function of an auction contract that &lt;em&gt;doesn&amp;rsquo;t&lt;/em&gt; use the withdraw pattern:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Don&amp;#39;t do this!&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return bid to previous high bidder.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This function is simple, but it has a well-known vulnerability. The high bidder can be a smart contract that refuses incoming ether. This means the &lt;code&gt;transfer&lt;/code&gt; call will fail, and the bidder can never be beaten no matter how low their bid.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s tempting to fix this by using &lt;code&gt;send&lt;/code&gt;, which returns a boolean status rather than reverting on failure. Replacing &lt;code&gt;transfer&lt;/code&gt; with &lt;code&gt;send&lt;/code&gt; in the previous code would mean a failure is ignored:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Don&amp;#39;t do this either!&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return bid to previous high bidder, ignoring failures.&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;send&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It seems at first like this takes care of the problem, because a high bidder causing a failure is only hurting themselves. However, this is heading down the path of &amp;ldquo;so complicated that there are no obvious deficiencies.&amp;rdquo; The code itself isn&amp;rsquo;t terribly complicated, but reasoning about it is. Someone reading the code needs to consider all the ways &lt;code&gt;send&lt;/code&gt; can fail and what happens in those cases.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s a flaw in the &lt;code&gt;send&lt;/code&gt; version of the code. The recipient of the &lt;code&gt;send&lt;/code&gt; isn&amp;rsquo;t the only one who can cause the transfer to fail. The new bidder can, for example, create a deep call stack before calling &lt;code&gt;bid&lt;/code&gt;. When &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.22/security-considerations.html#callstack-depth&#34;&gt;the maximum stack depth&lt;/a&gt; is exceeded, the transfer will fail and the previous high bidder will not receive their ether.&lt;/p&gt;

&lt;p&gt;Okay, things are getting a bit more complicated. This version detects a failed transfer and makes the funds available for explicit withdrawal by the recipient later:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Maybe this works?&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return bid to previous high bidder.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;send&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If ether wasn&amp;#39;t transferred, keep track of it.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// This is used to withdraw funds when a transfer fails.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Follow the Checks-Effects-Interactions pattern.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point, I &lt;em&gt;believe&lt;/em&gt; that the code is correct. Ether is either transferred during the &lt;code&gt;bid&lt;/code&gt; process or it&amp;rsquo;s tracked in &lt;code&gt;balances&lt;/code&gt; for later withdraw. I&amp;rsquo;ve corrected the code, but I&amp;rsquo;ve made the code more complicated. Not all corrections are equal, and it&amp;rsquo;s important not to settle for a complicated solution like this.&lt;/p&gt;

&lt;p&gt;The following code is simpler. Rather than use two different code paths for success and failure, all transfers happen the same way in the same place:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Withdraw pattern&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Return bid to previous high bidder.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Follow the Checks-Effects-Interactions pattern.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balances&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;All interaction with other contracts/accounts is in a single &lt;code&gt;withdraw&lt;/code&gt; function, where I&amp;rsquo;m confident &lt;a href=&#34;http://solidity.readthedocs.io/en/v0.4.21/security-considerations.html#re-entrancy&#34;&gt;the Checks-Effects-Interactions pattern&lt;/a&gt; keeps me safe from reentrancy attacks.&lt;/p&gt;

&lt;h2 id=&#34;less-thinking&#34;&gt;Less Thinking&lt;/h2&gt;

&lt;p&gt;Making your code &amp;ldquo;so simple that there are obviously no deficiencies&amp;rdquo; is not just about making the code shorter or having fewer functions. Note that the final version of the code above is longer and has more functions than the original. The key is that it&amp;rsquo;s &lt;em&gt;easier to reason about&lt;/em&gt;. I get to think less, which gives me a better chance of getting things right.&lt;/p&gt;

&lt;p&gt;A place where we recently got this wrong was in our post on &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/&#34;&gt;Flipping a Coin in Ethereum&lt;/a&gt;. I thought it was interesting that &lt;code&gt;claimTimeout&lt;/code&gt; could be called by anyone after the &lt;code&gt;expiration&lt;/code&gt; time passed, but an astute reader pointed out that because &lt;code&gt;expiration&lt;/code&gt; (at the time) was initially &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;claimTimeout&lt;/code&gt; could be called as soon as the contract was created. This would result in the first player losing their ether. The code is now fixed, but it would have been better to just restrict who could call &lt;code&gt;claimTimeout&lt;/code&gt;. Then I wouldn&amp;rsquo;t have to think about the various cases at all.&lt;/p&gt;

&lt;p&gt;We did better in our recent post on &lt;a href=&#34;https://programtheblockchain.com/posts/2018/04/03/writing-a-vickrey-auction-contract/&#34;&gt;Vickrey auctions&lt;/a&gt;, where we forbade bidding by the seller to avoid unnecessary complications.&lt;/p&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;

&lt;p&gt;The Solidity documentation covers two patterns used in this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://solidity.readthedocs.io/en/v0.4.21/common-patterns.html#withdrawal-from-contracts&#34;&gt;the withdraw pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://solidity.readthedocs.io/en/v0.4.21/security-considerations.html#re-entrancy&#34;&gt;the Checks-Effects-Interactions pattern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The quote from Tony Hoare comes from his 1980 Turing Award Lecture &lt;a href=&#34;http://zoo.cs.yale.edu/classes/cs422/2011/bib/hoare81emperor.pdf&#34;&gt;The Emperor&amp;rsquo;s Old Clothes&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Writing a Pawnshop Bazaar Contract</title>
      <link>https://programtheblockchain.com/posts/2018/04/13/writing-a-pawnshop-bazaar-contract/</link>
      <pubDate>Fri, 13 Apr 2018 05:44:23 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/13/writing-a-pawnshop-bazaar-contract/</guid>
      <description>&lt;p&gt;In our &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/13/writing-an-erc20-pawnshop-contract/&#34;&gt;pawnshop&lt;/a&gt; post, we built a contract that creates loans between a lender and multiple borrowers using ERC20 tokens as collateral.&lt;/p&gt;

&lt;p&gt;This post will demonstrate a token &lt;em&gt;bazaar&lt;/em&gt; contract which creates and tracks many pawnshops on behalf of many lenders.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/13/writing-an-erc20-pawnshop-contract/&#34;&gt;&lt;code&gt;PawnShop&lt;/code&gt; contract&lt;/a&gt; supports a single lender who accepts a single ERC20 token as collateral. Each lender who wants to do this needs to deploy their own &lt;code&gt;PawnShop&lt;/code&gt; contract.&lt;/p&gt;

&lt;p&gt;This works, but it makes it hard for potential borrowers to find a &lt;code&gt;PawnShop&lt;/code&gt;. Further, a borrower who trusts the &lt;code&gt;PawnShop&lt;/code&gt; contract code we presented will still need to check each &lt;code&gt;PawnShop&lt;/code&gt; to make sure it&amp;rsquo;s running the same code.&lt;/p&gt;

&lt;p&gt;To solve this problem, we can create a single token bazaar contract that does two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It creates new &lt;code&gt;PawnShop&lt;/code&gt;s using identical code for each.&lt;/li&gt;
&lt;li&gt;It tracks all the created &lt;code&gt;PawnShop&lt;/code&gt;s and makes them discoverable to new borrowers.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;the-pawnshop-bazaar-contract&#34;&gt;The Pawnshop Bazaar Contract&lt;/h2&gt;

&lt;p&gt;The contract uses techniques from the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/27/writing-a-token-market-contract/&#34;&gt;marketplace&lt;/a&gt; post for creating, recording, and logging new pawnshops:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;bazaar.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vcGF3bnNob3Auc29sIjsKCmNvbnRyYWN0IFBhd25TaG9wQmF6YWFyIHsKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiBQYXduU2hvcFtdKSBwdWJsaWMgcGF3blNob3BzOwoKICAgIGV2ZW50IFBhd25TaG9wQ3JlYXRlZChQYXduU2hvcCBwYXduc2hvcCwgYWRkcmVzcyBpbmRleGVkIGxlbmRlcikKCiAgICBmdW5jdGlvbiBjcmVhdGUoCiAgICAgICAgYWRkcmVzcyB0b2tlbiwKICAgICAgICB1aW50MjU2IGxvYW5OdW1lcmF0b3IsCiAgICAgICAgdWludDI1NiBsb2FuRGVub21pbmF0b3IsCiAgICAgICAgdWludDI1NiBwYXlvZmZOdW1lcmF0b3IsCiAgICAgICAgdWludDI1NiBwYXlvZmZEZW5vbWluYXRvciwKICAgICAgICB1aW50MjU2IGxvYW5EdXJhdGlvbgogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIFBhd25TaG9wIHBzID0gbmV3IFBhd25TaG9wKAogICAgICAgICAgICBtc2cuc2VuZGVyLAogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgbG9hbk51bWVyYXRvciwKICAgICAgICAgICAgbG9hbkRlbm9taW5hdG9yLAogICAgICAgICAgICBwYXlvZmZOdW1lcmF0b3IsCiAgICAgICAgICAgIHBheW9mZkRlbm9taW5hdG9yLAogICAgICAgICAgICBsb2FuRHVyYXRpb24KICAgICAgICApOwogICAgICAgIHBhd25TaG9wc1t0b2tlbl0ucHVzaChwcyk7CiAgICAgICAgZW1pdCBQYXduU2hvcENyZWF0ZWQocHMsIG1zZy5zZW5kZXIpOwogICAgfQp9Cg==&#34; download=&#39;bazaar.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./pawnshop.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShopBazaar&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[])&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pawnShops&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShopCreated&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pawnshop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;create&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ps&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;loanNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;loanDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;payoffNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;payoffDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pawnShops&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;ps&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShopCreated&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;ps&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;This code does the following things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt; deploys a new &lt;code&gt;PawnShop&lt;/code&gt; contract, which is owned by the lender/sender and is parameterized as they request.&lt;/li&gt;
&lt;li&gt;The new pawnshop is added to a publicly accessible list of pawnshops, which is indexed by token for convenience.&lt;/li&gt;
&lt;li&gt;The new pawnshop&amp;rsquo;s creation is announced with the &lt;code&gt;PawnShopCreated&lt;/code&gt; event.  The event is indexed by &lt;code&gt;lender&lt;/code&gt; so that the lender can easily recognize the pawnshop&amp;rsquo;s creation and keep track of its address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While that&amp;rsquo;s all the code that is needed, there are a few subtleties to note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The lender needs to record the address of any pawnshops they create, &lt;em&gt;and&lt;/em&gt; they should then monitor the &lt;code&gt;LoanCreated&lt;/code&gt; events that it produces.&lt;/li&gt;
&lt;li&gt;There is no way to delete a pawnshop from the bazaar contract.  While this functionality could be trivially added, no pawnshop owner would have an incentive to pay the gas to do this.&lt;/li&gt;
&lt;li&gt;While the bazaar contract can create pawnshops, it does not fund them, so the lender should deposit ether in the created pawnshop so that it can make loans.&lt;/li&gt;
&lt;li&gt;Because the state variable &lt;code&gt;pawnShops&lt;/code&gt; is marked &lt;code&gt;public&lt;/code&gt;, a &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/&#34;&gt;getter function&lt;/a&gt; is generated, allowing prospective borrowers to browse through the pawnshops accepting a specific ERC20 token.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;PawnShop&lt;/code&gt; contract&amp;rsquo;s state variables are all public. This is how potential borrowers can know the terms being offered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;p&gt;By using the existing &lt;code&gt;PawnShop&lt;/code&gt; contract and by leveraging the &lt;code&gt;TokenMarketPlace&lt;/code&gt; techniques, a very short smart contract can create a &lt;em&gt;bazaar&lt;/em&gt; that allows anybody to create a pawnshop to offer collateralized loans.&lt;/p&gt;

&lt;p&gt;This example demonstrates the power of contracts that deploy contracts.  The &lt;code&gt;PawnShopBazaar&lt;/code&gt; contract does little more than create &lt;code&gt;PawnShop&lt;/code&gt; contracts for lenders, and those &lt;code&gt;PawnShop&lt;/code&gt; contracts deploy individual &lt;code&gt;Loan&lt;/code&gt; contracts as needed when borrowers and lenders make a deal.  Contracts that deploy contracts that deploy contracts&amp;mdash;pretty cool.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Capture the Ether: the Game of Smart Contract Security</title>
      <link>https://programtheblockchain.com/posts/2018/04/10/capture-the-ether-the-game-of-smart-contract-security/</link>
      <pubDate>Tue, 10 Apr 2018 09:39:49 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/10/capture-the-ether-the-game-of-smart-contract-security/</guid>
      <description>&lt;p&gt;Capture the Ether is a game that tests your understanding of smart contract security by challenging you to hack a series of smart contracts.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://capturetheether.com&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/cte.png&#34; width=&#34;75%&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;h2 id=&#34;capture-the-flag-games&#34;&gt;Capture the Flag Games&lt;/h2&gt;

&lt;p&gt;In the context of computer security, a &lt;a href=&#34;https://en.wikipedia.org/wiki/Capture_the_flag#Computer_security&#34;&gt;Capture the Flag (CTF) competition&lt;/a&gt; is a game about finding and exploiting software vulnerabilities.&lt;/p&gt;

&lt;p&gt;Capture the Ether is an Ethereum-specific CTF game.&lt;/p&gt;

&lt;h2 id=&#34;learn-by-doing&#34;&gt;Learn By Doing&lt;/h2&gt;

&lt;p&gt;My first experience with Capture the Flag games was when I was working at Dropbox. Our security team ran an internal CTF, and I became quite obsessed with it.&lt;/p&gt;

&lt;p&gt;I certainly learned new things about security by participating, but for me the most valuable part was putting into practice things I &lt;em&gt;already&lt;/em&gt; knew in the abstract. By writing exploits myself, I gained a better understanding for how even a seemingly small vulnerability can be incredibly dangerous.&lt;/p&gt;

&lt;p&gt;I built Capture the Ether to provide that same rewarding experience for smart contract developers. Each challenge is in the form of a smart contract, and players earn points by exploiting it. It&amp;rsquo;s a test of your knowledge of smart contract security but also your ability to turn that abstract knowledge into a concrete exploit.&lt;/p&gt;

&lt;h2 id=&#34;results-so-far&#34;&gt;Results So Far&lt;/h2&gt;

&lt;p&gt;I launched the game last week with &lt;a href=&#34;https://www.reddit.com/r/ethdev/comments/89r2qz/capture_the_ether_the_game_of_ethereum_smart/?st=jfsfem80&amp;amp;sh=467734fc&#34;&gt;a Reddit post&lt;/a&gt;. At the time of this writing, 80 people have completed at least one of the challenges, and only two people have completed all 18 challenges in the initial batch. You can see the current high scores on &lt;a href=&#34;https://capturetheether.com/leaderboard&#34;&gt;the leaderboard&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;more-to-come&#34;&gt;More to Come&lt;/h2&gt;

&lt;p&gt;I have a few more challenges almost ready to publish, and my plan is to regularly add new challenges as I think of them. If you have ideas for new challenges, let me know! You can reach me at &lt;a href=&#34;mailto:smarx@smarx.com&#34;&gt;smarx@smarx.com&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Writing a Vickrey Auction Contract</title>
      <link>https://programtheblockchain.com/posts/2018/04/03/writing-a-vickrey-auction-contract/</link>
      <pubDate>Tue, 03 Apr 2018 11:00:33 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/04/03/writing-a-vickrey-auction-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to implement a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Vickrey_auction&#34;&gt;Vickrey auction&lt;/a&gt;.
The post assumes you are familiar with techniques introduced in my post on
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/27/writing-a-sealed-bid-auction-contract/&#34;&gt;sealed-bid auctions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Without going into a lot of
&lt;a href=&#34;https://en.wikipedia.org/wiki/Vickrey_auction&#34;&gt;detail&lt;/a&gt;,
there are many advantages to auctions in which the amount paid by the winner is &lt;em&gt;not&lt;/em&gt; their bid, but rather the next highest bid.  Such auctions are often called &amp;ldquo;second-price auctions&amp;rdquo; or &amp;ldquo;Vickrey auctions&amp;rdquo; (after the person who studied them).&lt;/p&gt;

&lt;h2 id=&#34;initialization-bidding-and-claiming-tokens&#34;&gt;Initialization, Bidding and Claiming Tokens&lt;/h2&gt;

&lt;p&gt;With the exception of determining the final selling price, implementing a second-price auction is essentially the same as implementing a
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/27/writing-a-sealed-bid-auction-contract/&#34;&gt;first-price sealed-bid auctions&lt;/a&gt;.  The following are identical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both auctions are parameterized by the same values:  the token, the reserve price, a bidding period, and a revealing period.&lt;/li&gt;
&lt;li&gt;Both auctions accept secret bids that are hashes of the actual bid and a random nonce.&lt;/li&gt;
&lt;li&gt;Both auctions require attached ether that is &lt;em&gt;at least as great&lt;/em&gt; as the secret bid.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;VickreyAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;VickreyAuction&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the seller can&amp;#39;t bid, but this simplifies withdrawal logic&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more code here&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The storage variables and constructor above are straightforward and similar to the sealed bid auction with just a few additions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage variables for the highest and second-highest bids are declared and initialized.  They are both initialized to the reserve price.  These phony starting values simplify maintaining these values correctly as bids are revealed.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;revealed&lt;/code&gt; mapping keeps track of which accounts have revealed their bids.&lt;/li&gt;
&lt;li&gt;The code initializes &lt;code&gt;revealed[seller]&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;, which will be exploited later in the withdrawal code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code for accepting sealed bids and that for claiming tokens is nearly identical to the analogous code in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/27/writing-a-sealed-bid-auction-contract/&#34;&gt;sealed-bid auction&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;bid&lt;/code&gt; code rejects bids from the seller, which eliminates the possibility that the seller can make a strategic bid, not reveal the bid, and yet get the associated ether refunded.  This possibility would have existed because the contract&amp;rsquo;s constructor initialized &lt;code&gt;revealed[seller]&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; despite no actual revelation taking place.&lt;/p&gt;

&lt;h2 id=&#34;revelation&#34;&gt;Revelation&lt;/h2&gt;

&lt;p&gt;Any contract that has a reveal phase must deal with failures to reveal, either implicitly or explicitly.  It&amp;rsquo;s important that the contract enforce the desired policy.&lt;/p&gt;

&lt;p&gt;In the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/27/writing-a-sealed-bid-auction-contract/&#34;&gt;sealed-bid auction&lt;/a&gt;,
the ether attached to unrevealed bids was simply refunded to the bidder.  For the Vickrey auction contract, I will implement a much stricter policy&amp;mdash;only ether attached to revealed losing bids will be refunded.  Ether attached to unrevealed bids will be forfeited forever.  This gives bidders a strong incentive to reveal their bids.  It also gives the seller a strong disincentive from submitting phony bids (via another account) to manipulate the final settling price.&lt;/p&gt;

&lt;p&gt;During the revelation period, the Vickrey auction must track both the highest bid (and bidder) as well as the second highest bid.  As each bid is processed, the contract will transfer ether balances (in &lt;code&gt;balanceOf&lt;/code&gt;) to reflect the results of the bidding so far.  Those transfers will be done with the &lt;code&gt;transfer&lt;/code&gt; helper routine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The contract tracks which accounts have revealed their bids in &lt;code&gt;revealed&lt;/code&gt;.  Bidders are only allowed to reveal their bid once.  This restriction avoids having to reason about the correctness of the code in the event of repeated reveals.  Forbidding something is easier than reasoning about it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reveal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// insufficient funds to cover bid amount, so ignore it&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// undo the previous escrow&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// update the highest and second highest bids&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// escrow an amount equal to the second highest bid&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// undo the previous escrow&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// update the second highest bid&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// escrow an amount equal to the second highest bid&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
   &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After every call to &lt;code&gt;reveal&lt;/code&gt;, the following invariants hold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;balanceOf[X]&lt;/code&gt; represents the ether amount account &lt;em&gt;X&lt;/em&gt; will be able withdraw &lt;em&gt;given the bids seen so far&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;highBidder&lt;/code&gt; represents the account making the highest bid &lt;em&gt;given the bids seen so far&lt;/em&gt;.  (If there were no successful bids, then this has the default value, which is the seller&amp;rsquo;s account.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;highBid&lt;/code&gt; represents the highest amount bid &lt;em&gt;given the bids seen so far&lt;/em&gt;.  (If there have been no successful bids, then this represents its default value, which is the reserve price.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;secondBid&lt;/code&gt; represents the amount that the high bidder will pay &lt;em&gt;given the bids seen so far&lt;/em&gt;.  (If there have been no successful bids, then this represents its default value, which is the reserve price.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The initialization of &lt;code&gt;highBid&lt;/code&gt; and &lt;code&gt;secondBid&lt;/code&gt; to the reserve price is a subtle technique, and it deserves some explanation for the possible cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If there are no revealed bids at or above the reserve price, then &lt;code&gt;reveal&lt;/code&gt; has no effect.  This means &lt;code&gt;highBidder&lt;/code&gt; will still be the seller&amp;rsquo;s account, and therefore the seller can withdraw their tokens.&lt;/li&gt;
&lt;li&gt;If there is exactly one revealed bid at or above the reserve price, then &lt;code&gt;highBid&lt;/code&gt; will be equal to that amount, and the amount paid will be the reserve price.  This is the correct behavior for a Vickrey auction.  (Note that the &amp;ldquo;undo the previous escrow&amp;rdquo; has no effect here because &lt;code&gt;highBidder&lt;/code&gt; was initialized to &lt;code&gt;seller&lt;/code&gt;, so the &lt;code&gt;secondBid&lt;/code&gt; amount is added and subtracted from the same entry in &lt;code&gt;balanceOf&lt;/code&gt;.)&lt;/li&gt;
&lt;li&gt;If there is more than one revealed bid at or above the reserve price, then &lt;code&gt;highBid&lt;/code&gt; will be the highest bid, and &lt;code&gt;secondBid&lt;/code&gt; will be the second highest bid.  The amount paid will be the second highest, which is correct as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;withdrawal&#34;&gt;Withdrawal&lt;/h2&gt;

&lt;p&gt;Withdrawal is nearly identical to the sealed-bid auction.  The only change is that we require that a bidder have revealed their bid.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the constructor initialized &lt;code&gt;revealed[seller]&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in anticipation of the seller withdrawing their ether after the auction.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This Vickrey auction contract uses the previously demonstrated techniques of using hashes for secrets, and attaching ether to secret bids.&lt;/li&gt;
&lt;li&gt;To encourage bid revelation, the contract causes non-revealers to forfeit their ether.&lt;/li&gt;
&lt;li&gt;Maintaining the highest and second highest bids is straightforward, although initializing them to the reserve price is subtle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contracts&#34;&gt;The Complete Contracts&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;vickreyauction.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IFZpY2tyZXlBdWN0aW9uIHsKICAgIGFkZHJlc3Mgc2VsbGVyOwoKICAgIElFUkMyMFRva2VuIHB1YmxpYyB0b2tlbjsKICAgIHVpbnQyNTYgcHVibGljIHJlc2VydmVQcmljZTsKICAgIHVpbnQyNTYgcHVibGljIGVuZE9mQmlkZGluZzsKICAgIHVpbnQyNTYgcHVibGljIGVuZE9mUmV2ZWFsaW5nOwoKICAgIGFkZHJlc3MgcHVibGljIGhpZ2hCaWRkZXI7CiAgICB1aW50MjU2IHB1YmxpYyBoaWdoQmlkOwogICAgdWludDI1NiBwdWJsaWMgc2Vjb25kQmlkOwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiBib29sKSBwdWJsaWMgcmV2ZWFsZWQ7CgogICAgZnVuY3Rpb24gVmlja3JleUF1Y3Rpb24oCiAgICAgICAgSUVSQzIwVG9rZW4gX3Rva2VuLAogICAgICAgIHVpbnQyNTYgX3Jlc2VydmVQcmljZSwKICAgICAgICB1aW50MjU2IGJpZGRpbmdQZXJpb2QsCiAgICAgICAgdWludDI1NiByZXZlYWxpbmdQZXJpb2QKICAgICkKICAgICAgICBwdWJsaWMKICAgIHsKICAgICAgICB0b2tlbiA9IF90b2tlbjsKICAgICAgICByZXNlcnZlUHJpY2UgPSBfcmVzZXJ2ZVByaWNlOwoKICAgICAgICBlbmRPZkJpZGRpbmcgPSBub3cgKyBiaWRkaW5nUGVyaW9kOwogICAgICAgIGVuZE9mUmV2ZWFsaW5nID0gZW5kT2ZCaWRkaW5nICsgcmV2ZWFsaW5nUGVyaW9kOwoKICAgICAgICBzZWxsZXIgPSBtc2cuc2VuZGVyOwoKICAgICAgICBoaWdoQmlkZGVyID0gc2VsbGVyOwogICAgICAgIGhpZ2hCaWQgPSByZXNlcnZlUHJpY2U7CiAgICAgICAgc2Vjb25kQmlkID0gcmVzZXJ2ZVByaWNlOwoKICAgICAgICAvLyB0aGUgc2VsbGVyIGNhbid0IGJpZCwgYnV0IHRoaXMgc2ltcGxpZmllcyB3aXRoZHJhd2FsIGxvZ2ljCiAgICAgICAgcmV2ZWFsZWRbc2VsbGVyXSA9IHRydWU7CiAgICB9CgogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpIHB1YmxpYyBiYWxhbmNlT2Y7CiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gYnl0ZXMzMikgcHVibGljIGhhc2hlZEJpZE9mOwoKICAgIGZ1bmN0aW9uIGJpZChieXRlczMyIGhhc2gpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICByZXF1aXJlKG5vdyA8IGVuZE9mQmlkZGluZyk7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyICE9IHNlbGxlcik7CgogICAgICAgIGhhc2hlZEJpZE9mW21zZy5zZW5kZXJdID0gaGFzaDsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gKz0gbXNnLnZhbHVlOwogICAgICAgIHJlcXVpcmUoYmFsYW5jZU9mW21zZy5zZW5kZXJdID49IHJlc2VydmVQcmljZSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhaW0oKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGVuZE9mUmV2ZWFsaW5nKTsKCiAgICAgICAgdWludDI1NiB0ID0gdG9rZW4uYmFsYW5jZU9mKHRoaXMpOwogICAgICAgIHJlcXVpcmUodG9rZW4udHJhbnNmZXIoaGlnaEJpZGRlciwgdCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyKGFkZHJlc3MgZnJvbSwgYWRkcmVzcyB0bywgdWludDI1NiBhbW91bnQpIHByaXZhdGUgewogICAgICAgIGJhbGFuY2VPZlt0b10gKz0gYW1vdW50OwogICAgICAgIGJhbGFuY2VPZltmcm9tXSAtPSBhbW91bnQ7CiAgICB9CgogICAgZnVuY3Rpb24gcmV2ZWFsKHVpbnQyNTYgYW1vdW50LCB1aW50MjU2IG5vbmNlKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGVuZE9mQmlkZGluZyAmJiBub3cgPCBlbmRPZlJldmVhbGluZyk7CgogICAgICAgIHJlcXVpcmUoa2VjY2FrMjU2KGFtb3VudCwgbm9uY2UpID09IGhhc2hlZEJpZE9mW21zZy5zZW5kZXJdKTsKCiAgICAgICAgcmVxdWlyZSghcmV2ZWFsZWRbbXNnLnNlbmRlcl0pOwogICAgICAgIHJldmVhbGVkW21zZy5zZW5kZXJdID0gdHJ1ZTsKCiAgICAgICAgaWYgKGFtb3VudCA&amp;#43;IGJhbGFuY2VPZlttc2cuc2VuZGVyXSkgewogICAgICAgICAgICAvLyBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gY292ZXIgYmlkIGFtb3VudCwgc28gaWdub3JlIGl0CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChhbW91bnQgPj0gaGlnaEJpZCkgewogICAgICAgICAgICAvLyB1bmRvIHRoZSBwcmV2aW91cyBlc2Nyb3cKICAgICAgICAgICAgdHJhbnNmZXIoc2VsbGVyLCBoaWdoQmlkZGVyLCBzZWNvbmRCaWQpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBoaWdoZXN0IGFuZCBzZWNvbmQgaGlnaGVzdCBiaWRzCiAgICAgICAgICAgIHNlY29uZEJpZCA9IGhpZ2hCaWQ7CiAgICAgICAgICAgIGhpZ2hCaWQgPSBhbW91bnQ7CiAgICAgICAgICAgIGhpZ2hCaWRkZXIgPSBtc2cuc2VuZGVyOwoKICAgICAgICAgICAgLy8gZXNjcm93IGFuIGFtb3VudCBlcXVhbCB0byB0aGUgc2Vjb25kIGhpZ2hlc3QgYmlkCiAgICAgICAgICAgIHRyYW5zZmVyKGhpZ2hCaWRkZXIsIHNlbGxlciwgc2Vjb25kQmlkKTsKICAgICAgICB9IGVsc2UgaWYgKGFtb3VudCA&amp;#43;IHNlY29uZEJpZCkgewogICAgICAgICAgICAvLyB1bmRvIHRoZSBwcmV2aW91cyBlc2Nyb3cKICAgICAgICAgICAgdHJhbnNmZXIoc2VsbGVyLCBoaWdoQmlkZGVyLCBzZWNvbmRCaWQpOwoKICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBzZWNvbmQgaGlnaGVzdCBiaWQKICAgICAgICAgICAgc2Vjb25kQmlkID0gYW1vdW50OwoKICAgICAgICAgICAgLy8gZXNjcm93IGFuIGFtb3VudCBlcXVhbCB0byB0aGUgc2Vjb25kIGhpZ2hlc3QgYmlkCiAgICAgICAgICAgIHRyYW5zZmVyKGhpZ2hCaWRkZXIsIHNlbGxlciwgc2Vjb25kQmlkKTsKICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB3aXRoZHJhdygpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShub3cgPj0gZW5kT2ZSZXZlYWxpbmcpOwogICAgICAgIHJlcXVpcmUocmV2ZWFsZWRbbXNnLnNlbmRlcl0pOwoKICAgICAgICB1aW50MjU2IGFtb3VudCA9IGJhbGFuY2VPZlttc2cuc2VuZGVyXTsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPSAwOwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KfQo=&#34; download=&#39;vickreyauction.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;VickreyAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;VickreyAuction&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the seller can&amp;#39;t bid, but this simplifies withdrawal logic&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reveal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;])&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// insufficient funds to cover bid amount, so ignore it&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// undo the previous escrow&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// update the highest and second highest bids&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// escrow an amount equal to the second highest bid&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// undo the previous escrow&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// update the second highest bid&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// escrow an amount equal to the second highest bid&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;secondBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
       &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;revealed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Storage Patterns: Doubly Linked List</title>
      <link>https://programtheblockchain.com/posts/2018/03/30/storage-patterns-doubly-linked-list/</link>
      <pubDate>Fri, 30 Mar 2018 09:44:41 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/30/storage-patterns-doubly-linked-list/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll build a &lt;a href=&#34;https://en.wikipedia.org/wiki/Doubly_linked_list&#34;&gt;doubly linked list&lt;/a&gt; in Solidity. A &lt;a href=&#34;https://en.wikipedia.org/wiki/Doubly_linked_list&#34;&gt;doubly linked list&lt;/a&gt; supports efficient insertion and deletion of nodes anywhere within an ordered list. I&amp;rsquo;ll be building on concepts introduced in &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/&#34;&gt;&amp;ldquo;Understanding Ethereum Smart Contract Storage&amp;rdquo;&lt;/a&gt; and &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/23/storage-patterns-stacks-queues-and-deques/&#34;&gt;&amp;ldquo;Storage Patterns: Stacks, Queues, and Deques&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;the-nodes&#34;&gt;The Nodes&lt;/h2&gt;

&lt;p&gt;In addition to the data being stored, each node in a doubly linked list has pointers to the previous and next node in the list:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DoublyLinkedList&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; fields are of type &lt;code&gt;uint256&lt;/code&gt;. There are no pointer types in Solidity, so each node in the list is given a unique ID, and the &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; fields refer to those IDs. I&amp;rsquo;m using a dynamically-sized array to keep track of nodes, and a node&amp;rsquo;s index in the array is its ID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nodes[0].next is head, and nodes[0].prev is tail.&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DoublyLinkedList&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// sentinel&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The first element of the array is reserved as a sentinel. Its &lt;code&gt;next&lt;/code&gt; link points to the head of the list, and its &lt;code&gt;prev&lt;/code&gt; link points to the tail. Technically, what I&amp;rsquo;m building here is a &lt;em&gt;circular&lt;/em&gt; doubly linked list where one element is a sentinel. If you were to keep following &lt;code&gt;next&lt;/code&gt; or &lt;code&gt;prev&lt;/code&gt; links, you would pass through the sentinel and back to the other end of the list.&lt;/p&gt;

&lt;h2 id=&#34;inserting-a-node&#34;&gt;Inserting a Node&lt;/h2&gt;

&lt;p&gt;A doubly-linked list supports insertion at arbitrary points within the list. When inserting into the list, a new node needs to be created, and the &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; links in the neighboring nodes need to be updated:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertAfter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 0 is allowed here to insert at the beginning.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Node storage node&lt;/code&gt; declares a &lt;em&gt;reference&lt;/em&gt; to a &lt;code&gt;Node&lt;/code&gt; in storage. This is used here to make reading and writing that node&amp;rsquo;s fields easier.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodes.push&lt;/code&gt; is essentially an allocation. It adds a new node to the array and initializes its fields.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodes.length - 1&lt;/code&gt; is the index in the array where the new node was added. This is considered the node&amp;rsquo;s ID.&lt;/li&gt;
&lt;li&gt;Finally, the &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; links in the neighboring nodes are updated to point to the new node.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;isValidNode&lt;/code&gt; checks if the node specified by the &lt;code&gt;id&lt;/code&gt; parameter is a valid node in the list:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 0 is a sentinel and therefore invalid.&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// A valid node is the head or has a previous node.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Given &lt;code&gt;insertAfter&lt;/code&gt;, it&amp;rsquo;s trivial to implement &lt;code&gt;insertBefore&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertBefore&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertAfter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that because this is a circular linked list, no special care needs to be taken with the head and tail of the list. To insert a node at the beginning of the list, call &lt;code&gt;insertAfter(0, data)&lt;/code&gt;. To insert a node at the end of the list, call &lt;code&gt;insertBefore(0, data)&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;removing-a-node&#34;&gt;Removing a Node&lt;/h2&gt;

&lt;p&gt;Removing a node means updating its neighbors&amp;rsquo; &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; links and deleting the removed node to reclaim its storage:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remove&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Executing &lt;code&gt;delete nodes[id]&lt;/code&gt; results in a gas refund for reclaiming storage space. Recall from our post &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/&#34;&gt;Understanding Ethereum Smart Contract Storage&lt;/a&gt;&amp;rdquo; that zeros are not actually stored, so deleting the node reclaims storage even though the underlying array length is not changed.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A doubly linked list is a useful data structure when arbitrary insertion or deletion is required and order is important.&lt;/li&gt;
&lt;li&gt;Using a circular doubly linked list avoids edge cases when inserting or deleting nodes at the ends of the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-code&#34;&gt;Full Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;doublylinkedlist.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBEb3VibHlMaW5rZWRMaXN0IHsKICAgIHN0cnVjdCBOb2RlIHsKICAgICAgICBieXRlcyBkYXRhOwogICAgICAgIHVpbnQyNTYgcHJldjsKICAgICAgICB1aW50MjU2IG5leHQ7CiAgICB9CgogICAgLy8gbm9kZXNbMF0ubmV4dCBpcyBoZWFkLCBhbmQgbm9kZXNbMF0ucHJldiBpcyB0YWlsLgogICAgTm9kZVtdIHB1YmxpYyBub2RlczsKCiAgICBmdW5jdGlvbiBEb3VibHlMaW5rZWRMaXN0KCkgcHVibGljIHsKICAgICAgICAvLyBzZW50aW5lbAogICAgICAgIG5vZGVzLnB1c2goTm9kZShuZXcgYnl0ZXMoMCksIDAsIDApKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNlcnRBZnRlcih1aW50MjU2IGlkLCBieXRlcyBkYXRhKSBwdWJsaWMgcmV0dXJucyAodWludDI1NiBuZXdJRCkgewogICAgICAgIC8vIDAgaXMgYWxsb3dlZCBoZXJlIHRvIGluc2VydCBhdCB0aGUgYmVnaW5uaW5nLgogICAgICAgIHJlcXVpcmUoaWQgPT0gMCB8fCBpc1ZhbGlkTm9kZShpZCkpOwoKICAgICAgICBOb2RlIHN0b3JhZ2Ugbm9kZSA9IG5vZGVzW2lkXTsKCiAgICAgICAgbm9kZXMucHVzaChOb2RlKHsKICAgICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgICAgcHJldjogaWQsCiAgICAgICAgICAgIG5leHQ6IG5vZGUubmV4dAogICAgICAgIH0pKTsKCiAgICAgICAgbmV3SUQgPSBub2Rlcy5sZW5ndGggLSAxOwoKICAgICAgICBub2Rlc1tub2RlLm5leHRdLnByZXYgPSBuZXdJRDsKICAgICAgICBub2RlLm5leHQgPSBuZXdJRDsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNlcnRCZWZvcmUodWludDI1NiBpZCwgYnl0ZXMgZGF0YSkgcHVibGljIHJldHVybnMgKHVpbnQyNTYgbmV3SUQpIHsKICAgICAgICByZXR1cm4gaW5zZXJ0QWZ0ZXIobm9kZXNbaWRdLnByZXYsIGRhdGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZSh1aW50MjU2IGlkKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoaXNWYWxpZE5vZGUoaWQpKTsKCiAgICAgICAgTm9kZSBzdG9yYWdlIG5vZGUgPSBub2Rlc1tpZF07CgogICAgICAgIG5vZGVzW25vZGUubmV4dF0ucHJldiA9IG5vZGUucHJldjsKICAgICAgICBub2Rlc1tub2RlLnByZXZdLm5leHQgPSBub2RlLm5leHQ7CgogICAgICAgIGRlbGV0ZSBub2Rlc1tpZF07CiAgICB9CgogICAgZnVuY3Rpb24gaXNWYWxpZE5vZGUodWludDI1NiBpZCkgaW50ZXJuYWwgdmlldyByZXR1cm5zIChib29sKSB7CiAgICAgICAgLy8gMCBpcyBhIHNlbnRpbmVsIGFuZCB0aGVyZWZvcmUgaW52YWxpZC4KICAgICAgICAvLyBBIHZhbGlkIG5vZGUgaXMgdGhlIGhlYWQgb3IgaGFzIGEgcHJldmlvdXMgbm9kZS4KICAgICAgICByZXR1cm4gaWQgIT0gMCAmJiAoaWQgPT0gbm9kZXNbMF0ubmV4dCB8fCBub2Rlc1tpZF0ucHJldiAhPSAwKTsKICAgIH0KfQo=&#34; download=&#39;doublylinkedlist.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DoublyLinkedList&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nodes[0].next is head, and nodes[0].prev is tail.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;DoublyLinkedList&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// sentinel&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertAfter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 0 is allowed here to insert at the beginning.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertBefore&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newID&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;insertAfter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remove&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;Node&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidNode&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// 0 is a sentinel and therefore invalid.&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// A valid node is the head or has a previous node.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;next&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nodes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;prev&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Sealed-Bid Auction Contract</title>
      <link>https://programtheblockchain.com/posts/2018/03/27/writing-a-sealed-bid-auction-contract/</link>
      <pubDate>Tue, 27 Mar 2018 09:32:58 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/27/writing-a-sealed-bid-auction-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to implement a
&lt;a href=&#34;https://en.wikipedia.org/wiki/First-price_sealed-bid_auction&#34;&gt;first-price sealed-bid auction&lt;/a&gt;
of ERC20 tokens.  The post assumes you are familiar with techniques introduced in our posts on
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;English auctions&lt;/a&gt;
and
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/&#34;&gt;revealing secrets&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;First-price sealed-bid auctions proceed in a three-step process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;During a bidding period, each bidder submits a secret bid.&lt;/li&gt;
&lt;li&gt;After the bidding period, all of the previously-secret bids are revealed.&lt;/li&gt;
&lt;li&gt;The high bidder wins the auction in exchange for their entire bid amount.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To implement this as a smart contract, the code will follow that process, employing techniques we&amp;rsquo;ve previously introduced.  For instance, the contract will use cryptographic
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/&#34;&gt;hashes&lt;/a&gt;
to submit secret bids.&lt;/p&gt;

&lt;p&gt;We also want bids to have ether attached to ensure that the winning bid will, in fact, follow through with the purchase.  This presents a challenge, however, because the amount of ether attached is &lt;em&gt;not&lt;/em&gt; a secret on the blockchain.  Therefore, the contract will require that bids have ether attached that equals &lt;em&gt;or exceeds&lt;/em&gt; their secret bid.&lt;/p&gt;

&lt;h2 id=&#34;starting-the-auction&#34;&gt;Starting the Auction&lt;/h2&gt;

&lt;p&gt;A first-price sealed-bid auction is parameterized by a few values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;good&lt;/strong&gt; being sold.  For this contract, that will be a given ERC20 token.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;reserve price&lt;/strong&gt; is the lowest acceptable bid.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;bidding period&lt;/strong&gt; is the amount of time during which bidders may submit bids.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a real-world auction, bidders submit bids in sealed envelopes, and those bids are revealed by opening envelopes, which doesn&amp;rsquo;t require any cooperation from the bidders.  In Ethereum, a bidder submits a hash of their bid, and then they must present the actual bid, which is verified against the hash they previously provided.  Hence, the contract needs to give them some time to do that.  To implement this as a smart contract, we also need another parameter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;reveal period&lt;/strong&gt; is the amount of time after the bidding closes that bidders can reveal their bids.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These values are easily captured in code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EnglishAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EnglishAuction&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Just like the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/&#34;&gt;English auction&lt;/a&gt;,
this contract will operate on the assumption that the seller will transfer the tokens to it.  Bidders should verify the transfer before placing bids, of course.&lt;/p&gt;

&lt;h2 id=&#34;bids-and-escrowed-funds&#34;&gt;Bids and Escrowed Funds&lt;/h2&gt;

&lt;p&gt;Bidding requires the contract to log both the sealed bid (hash) and the amount of ether attached to the bid.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A real-world sealed-bid auction typically allows only one bid.  I&amp;rsquo;ve generalized that above to allow new bids that overwrite previous bids.  All attached ether to multiple bids is accumulated.&lt;/p&gt;

&lt;h2 id=&#34;revealing-bids&#34;&gt;Revealing Bids&lt;/h2&gt;

&lt;p&gt;The hash of a bid is computed with a random nonce exactly as introduced in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/&#34;&gt;coin-flipping post&lt;/a&gt;.
Bidders reveal their bids by providing both their bid and their nonce.&lt;/p&gt;

&lt;p&gt;As bids are revealed, the contract will keep track of the high bidder and their bid, and it will adjust the &lt;code&gt;balanceOf&lt;/code&gt; amounts so that it tracks non-escrowed ether.  The current winning bid will also be reflected as the &lt;code&gt;balanceOf[seller]&lt;/code&gt; so that it will be available to the seller after the auction.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reveal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// return escrowed bid to previous high bidder&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer new high bid from high bidder to seller&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above maintains the following invariants upon exit, which make withdrawing funds and claiming tokens trivial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;balanceOf[seller]&lt;/code&gt; represents the amount the seller will be able to withdraw &lt;em&gt;given the bids seen so far&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;balanceOf[X]&lt;/code&gt; represents the ether amount account &lt;em&gt;X&lt;/em&gt; will be able withdraw &lt;em&gt;given the bids seen so far&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;highBidder&lt;/code&gt; represents the account making the highest bid &lt;em&gt;given the bids seen so far&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given those invariants, when revealing completes, all accounts&amp;mdash;seller and bidders&amp;mdash;may withdraw their &lt;code&gt;balanceOf&lt;/code&gt; amount.&lt;/p&gt;

&lt;p&gt;The code also employs one (very?) subtle feature:  &lt;code&gt;highBidder&lt;/code&gt; is initialized to &lt;code&gt;msg.sender&lt;/code&gt;, which is the account that creates the auction (i.e, the seller).  This default value is overwritten by the first successful bid, so it&amp;rsquo;s only important if there are no successful bids on this auction.  This will be exploited below in &lt;code&gt;claim&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;bid&lt;/code&gt; code allows seller-initiated bids, and &lt;code&gt;reveal&lt;/code&gt; handles them correctly.  It&amp;rsquo;s generally considered bad for sellers to bid in their own auction, but I&amp;rsquo;ve chosen to allow them because forbidding them would be futile.  (It would be trivial for the seller to transfer ether to another account and bid from there.)&lt;/p&gt;

&lt;h2 id=&#34;withdrawal&#34;&gt;Withdrawal&lt;/h2&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;claiming&#34;&gt;Claiming&lt;/h2&gt;

&lt;p&gt;After the reveal period, the high bidder can claim their tokens:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This routine trivially handles any auction for which there was a successful bid.  More subtly, it also handles returning the tokens to the seller when there are no successful bids because &lt;code&gt;highBidder&lt;/code&gt;&amp;rsquo;s default value is, in fact, that of the seller.&lt;/p&gt;

&lt;p&gt;The high bidder can also claim any excess ether&amp;mdash;the difference between their bid and the amount attached to the bid(s)&amp;mdash;using &lt;code&gt;withdraw&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;failing-to-reveal-policy&#34;&gt;Failing to Reveal Policy&lt;/h2&gt;

&lt;p&gt;Any contract that has a reveal phase must deal with failures to reveal, either implicitly or explicitly.  It&amp;rsquo;s important that the contract enforce the desired policy.&lt;/p&gt;

&lt;p&gt;As written, this contract does nothing explicit with respect to accounts that fail to reveal their bids.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;What happens to the ether that was attached to an unrevealed bids?&lt;/em&gt;  Ether attached to an unrevealed bid can be withdrawn after the revealing period&amp;mdash;just as if it were attached to a losing bid.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What if the unrevealed bid would have won the auction?&lt;/em&gt; This is bad for the seller, obviously, because they would receive less ether.  The bidder, too, suffers because they don&amp;rsquo;t get to claim the tokens at a price that they presumably would have wanted.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Can this be exploited by strategic bidding?&lt;/em&gt; Yes&amp;mdash;a bidder could make multiple bids at different prices and only reveal the lowest winning bid.  This is not entirely bad because they would still have to beat the bids revealed by other bidders.  This strategy has merits because it allows this auction to result in a winning bid approximating a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Vickrey_auction&#34;&gt;second-price auction&lt;/a&gt;.  (It does, however, require the strategic bidder to use multiple accounts and to escrow ether for each of those bids.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A smart contract can conduct a first-price sealed-bid auction.&lt;/li&gt;
&lt;li&gt;The auction uses cryptographic hashes to implement sealed bids.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;sealedbidauction.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IFNlYWxlZEJpZEF1Y3Rpb24gewogICAgYWRkcmVzcyBzZWxsZXI7CgogICAgSUVSQzIwVG9rZW4gcHVibGljIHRva2VuOwogICAgdWludDI1NiBwdWJsaWMgcmVzZXJ2ZVByaWNlOwogICAgdWludDI1NiBwdWJsaWMgZW5kT2ZCaWRkaW5nOwogICAgdWludDI1NiBwdWJsaWMgZW5kT2ZSZXZlYWxpbmc7CgogICAgZnVuY3Rpb24gU2VhbGVkQmlkQXVjdGlvbigKICAgICAgICBJRVJDMjBUb2tlbiBfdG9rZW4sCiAgICAgICAgdWludDI1NiBfcmVzZXJ2ZVByaWNlLAogICAgICAgIHVpbnQyNTYgYmlkZGluZ1BlcmlvZCwKICAgICAgICB1aW50MjU2IHJldmVhbGluZ1BlcmlvZAogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIHRva2VuID0gX3Rva2VuOwogICAgICAgIHJlc2VydmVQcmljZSA9IF9yZXNlcnZlUHJpY2U7CgogICAgICAgIGVuZE9mQmlkZGluZyA9IG5vdyArIGJpZGRpbmdQZXJpb2Q7CiAgICAgICAgZW5kT2ZSZXZlYWxpbmcgPSBlbmRPZkJpZGRpbmcgKyByZXZlYWxpbmdQZXJpb2Q7CgogICAgICAgIHNlbGxlciA9IG1zZy5zZW5kZXI7CiAgICB9CgogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpIHB1YmxpYyBiYWxhbmNlT2Y7CiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gYnl0ZXMzMikgcHVibGljIGhhc2hlZEJpZE9mOwoKICAgIGZ1bmN0aW9uIGJpZChieXRlczMyIGhhc2gpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICByZXF1aXJlKG5vdyA8IGVuZE9mQmlkZGluZyk7CgogICAgICAgIGhhc2hlZEJpZE9mW21zZy5zZW5kZXJdID0gaGFzaDsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gKz0gbXNnLnZhbHVlOwogICAgICAgIHJlcXVpcmUoYmFsYW5jZU9mW21zZy5zZW5kZXJdID49IHJlc2VydmVQcmljZSk7CiAgICB9CgogICAgYWRkcmVzcyBwdWJsaWMgaGlnaEJpZGRlciA9IG1zZy5zZW5kZXI7CiAgICB1aW50MjU2IHB1YmxpYyBoaWdoQmlkOwoKICAgIGZ1bmN0aW9uIHJldmVhbCh1aW50MjU2IGFtb3VudCwgdWludDI1NiBub25jZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG5vdyA&amp;#43;PSBlbmRPZkJpZGRpbmcgJiYgbm93IDwgZW5kT2ZSZXZlYWxpbmcpOwoKICAgICAgICByZXF1aXJlKGtlY2NhazI1NihhbW91bnQsIG5vbmNlKSA9PSBoYXNoZWRCaWRPZlttc2cuc2VuZGVyXSk7CgogICAgICAgIHJlcXVpcmUoYW1vdW50ID49IHJlc2VydmVQcmljZSk7CiAgICAgICAgcmVxdWlyZShhbW91bnQgPD0gYmFsYW5jZU9mW21zZy5zZW5kZXJdKTsKCiAgICAgICAgaWYgKGFtb3VudCA&amp;#43;IGhpZ2hCaWQpIHsKICAgICAgICAgICAgLy8gcmV0dXJuIGVzY3Jvd2VkIGJpZCB0byBwcmV2aW91cyBoaWdoIGJpZGRlcgogICAgICAgICAgICBiYWxhbmNlT2Zbc2VsbGVyXSAtPSBoaWdoQmlkOwogICAgICAgICAgICBiYWxhbmNlT2ZbaGlnaEJpZGRlcl0gKz0gaGlnaEJpZDsKCiAgICAgICAgICAgIGhpZ2hCaWQgPSBhbW91bnQ7CiAgICAgICAgICAgIGhpZ2hCaWRkZXIgPSBtc2cuc2VuZGVyOwoKICAgICAgICAgICAgLy8gdHJhbnNmZXIgbmV3IGhpZ2ggYmlkIGZyb20gaGlnaCBiaWRkZXIgdG8gc2VsbGVyCiAgICAgICAgICAgIGJhbGFuY2VPZltoaWdoQmlkZGVyXSAtPSBoaWdoQmlkOwogICAgICAgICAgICBiYWxhbmNlT2Zbc2VsbGVyXSArPSBoaWdoQmlkOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB3aXRoZHJhdygpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShub3cgPj0gZW5kT2ZSZXZlYWxpbmcpOwoKICAgICAgICB1aW50MjU2IGFtb3VudCA9IGJhbGFuY2VPZlttc2cuc2VuZGVyXTsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPSAwOwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFpbSgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShub3cgPj0gZW5kT2ZSZXZlYWxpbmcpOwoKICAgICAgICB1aW50MjU2IHQgPSB0b2tlbi5iYWxhbmNlT2YodGhpcyk7CiAgICAgICAgdG9rZW4udHJhbnNmZXIoaGlnaEJpZGRlciwgdCk7CiAgICB9Cn0K&#34; download=&#39;sealedbidauction.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SealedBidAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SealedBidAuction&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;biddingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;revealingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reveal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfBidding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hashedBidOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// return escrowed bid to previous high bidder&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

            &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer new high bid from high bidder to seller&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claim&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfRevealing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Storage Patterns: Stacks Queues and Deques</title>
      <link>https://programtheblockchain.com/posts/2018/03/23/storage-patterns-stacks-queues-and-deques/</link>
      <pubDate>Fri, 23 Mar 2018 07:58:57 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/23/storage-patterns-stacks-queues-and-deques/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll show how a few common data structures can be implemented in Solidity. I recommend first reading our post &amp;ldquo;&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/&#34;&gt;Understanding Ethereum Smart Contract Storage&lt;/a&gt;.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;stack&#34;&gt;Stack&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&#34;https://en.wikipedia.org/wiki/Stack_(abstract_data_type)&#34;&gt;stack&lt;/a&gt; is a &amp;ldquo;last-in, first-out&amp;rdquo; (LIFO) data structure with the operations &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pop&lt;/code&gt;. This is a natural fit for Solidity&amp;rsquo;s dynamically-sized arrays, but note that Solidity does not (yet) provide a &lt;code&gt;pop&lt;/code&gt; operation. The below is an implementation of a stack of &lt;code&gt;bytes&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;stack.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBTdGFjayB7CiAgICBieXRlc1tdIHN0YWNrOwoKICAgIGZ1bmN0aW9uIHB1c2goYnl0ZXMgZGF0YSkgcHVibGljIHsKICAgICAgICBzdGFjay5wdXNoKGRhdGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcCgpIHB1YmxpYyByZXR1cm5zIChieXRlcyBkYXRhKSB7CiAgICAgICAgZGF0YSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwoKICAgICAgICBzdGFjay5sZW5ndGggLT0gMTsKICAgIH0KfQo=&#34; download=&#39;stack.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Stack&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;stack&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;stack&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;stack&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;stack&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;stack&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;A few things to note in the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the array is empty, bounds checking will cause &lt;code&gt;pop&lt;/code&gt; to revert the transaction.&lt;/li&gt;
&lt;li&gt;Decreasing the length of a dynamically-sized array has a side effect of zeroing the &amp;ldquo;removed&amp;rdquo; items. This is why there&amp;rsquo;s no need for a &lt;code&gt;delete stack[stack.length - 1]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;queue&#34;&gt;Queue&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&#34;https://en.wikipedia.org/wiki/Queue_(abstract_data_type)&#34;&gt;queue&lt;/a&gt; is a &amp;ldquo;first-in, first-out&amp;rdquo; (FIFO) data structure with the operations &lt;code&gt;enqueue&lt;/code&gt; and &lt;code&gt;dequeue&lt;/code&gt;. It&amp;rsquo;s reasonable to implement this with a dynamically-sized array, but a &lt;code&gt;mapping&lt;/code&gt; may be a better choice:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;queue.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBRdWV1ZSB7CiAgICBtYXBwaW5nKHVpbnQyNTYgPT4gYnl0ZXMpIHF1ZXVlOwogICAgdWludDI1NiBmaXJzdCA9IDE7CiAgICB1aW50MjU2IGxhc3QgPSAwOwoKICAgIGZ1bmN0aW9uIGVucXVldWUoYnl0ZXMgZGF0YSkgcHVibGljIHsKICAgICAgICBsYXN0ICs9IDE7CiAgICAgICAgcXVldWVbbGFzdF0gPSBkYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlcXVldWUoKSBwdWJsaWMgcmV0dXJucyAoYnl0ZXMgZGF0YSkgewogICAgICAgIHJlcXVpcmUobGFzdCA&amp;#43;PSBmaXJzdCk7ICAvLyBub24tZW1wdHkgcXVldWUKCiAgICAgICAgZGF0YSA9IHF1ZXVlW2ZpcnN0XTsKCiAgICAgICAgZGVsZXRlIHF1ZXVlW2ZpcnN0XTsKICAgICAgICBmaXJzdCArPSAxOwogICAgfQp9Cg==&#34; download=&#39;queue.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Queue&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;queue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;enqueue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;queue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dequeue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// non-empty queue&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;queue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;queue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;A brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Items are stored at consecutive indices in the &lt;code&gt;queue&lt;/code&gt; mapping. The first used index will be 1.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;first&lt;/code&gt; indicates the first valid index in the queue. It starts at 1 so I can use 0 for &lt;code&gt;last&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last&lt;/code&gt; indicates the last valid index in the queue. It starts at 0 because there are initially no valid indices.&lt;/li&gt;
&lt;li&gt;Unlike in the stack contract, where decreasing the array size took care of it, this contract needs to call &lt;code&gt;delete&lt;/code&gt; to clear storage when an element is dequeued.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dynamically-sized arrays and &lt;code&gt;mapping&lt;/code&gt;s in Solidity are not very different. They both map keys to values. Arrays are limited to &lt;code&gt;uint256&lt;/code&gt; keys, and they do bounds checking. Dynamically-sized arrays also record their length and perform some automated cleanup when that length is adjusted.&lt;/p&gt;

&lt;p&gt;In the stack implementation, I made use of the bounds checking and automatic cleanup. In the case of a queue, both of those things need to be done manually, at least on the &amp;ldquo;left&amp;rdquo; side of the queue. For that reason, a &lt;code&gt;mapping&lt;/code&gt; seemed like a more natural fit to me.&lt;/p&gt;

&lt;h2 id=&#34;deque&#34;&gt;Deque&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&#34;https://en.wikipedia.org/wiki/Double-ended_queue&#34;&gt;deque&lt;/a&gt; (sometimes &amp;ldquo;dequeue&amp;rdquo; or &amp;ldquo;double-ended queue&amp;rdquo;) is a generalization of a queue that allows insertion and deletion from both ends. It supports the operations &lt;code&gt;pushLeft&lt;/code&gt;, &lt;code&gt;pushRight&lt;/code&gt;, &lt;code&gt;popLeft&lt;/code&gt;, and &lt;code&gt;popRight&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;deque.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBEZXF1ZSB7CiAgICBtYXBwaW5nKHVpbnQyNTYgPT4gYnl0ZXMpIGRlcXVlOwogICAgdWludDI1NiBmaXJzdCA9IDIqKjI1NTsKICAgIHVpbnQyNTYgbGFzdCA9IGZpcnN0IC0gMTsKCiAgICBmdW5jdGlvbiBwdXNoTGVmdChieXRlcyBkYXRhKSBwdWJsaWMgewogICAgICAgIGZpcnN0IC09IDE7CiAgICAgICAgZGVxdWVbZmlyc3RdID0gZGF0YTsKICAgIH0KCiAgICBmdW5jdGlvbiBwdXNoUmlnaHQoYnl0ZXMgZGF0YSkgcHVibGljIHsKICAgICAgICBsYXN0ICs9IDE7CiAgICAgICAgZGVxdWVbbGFzdF0gPSBkYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcExlZnQoKSBwdWJsaWMgcmV0dXJucyAoYnl0ZXMgZGF0YSkgewogICAgICAgIHJlcXVpcmUobGFzdCA&amp;#43;PSBmaXJzdCk7ICAvLyBub24tZW1wdHkgZGVxdWUKCiAgICAgICAgZGF0YSA9IGRlcXVlW2ZpcnN0XTsKCiAgICAgICAgZGVsZXRlIGRlcXVlW2ZpcnN0XTsKICAgICAgICBmaXJzdCArPSAxOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcFJpZ2h0KCkgcHVibGljIHJldHVybnMgKGJ5dGVzIGRhdGEpIHsKICAgICAgICByZXF1aXJlKGxhc3QgPj0gZmlyc3QpOyAgLy8gbm9uLWVtcHR5IGRlcXVlCgogICAgICAgIGRhdGEgPSBkZXF1ZVtsYXN0XTsKCiAgICAgICAgZGVsZXRlIGRlcXVlW2xhc3RdOwogICAgICAgIGxhc3QgLT0gMTsKICAgIH0KfQo=&#34; download=&#39;deque.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Deque&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pushLeft&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pushRight&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;popLeft&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// non-empty deque&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;popRight&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// non-empty deque&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deque&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;This code is much like the queue implementation except that the queue can grow in both directions. To maximize how much room is available to grow, &lt;code&gt;first&lt;/code&gt; is initialized to 2&lt;sup&gt;255&lt;/sup&gt;, exactly half way through the 256-bit space available for indices.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;With a basic understanding of &lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/&#34;&gt;Solidity storage&lt;/a&gt;, simple data structures can be implemented with very little code.&lt;/li&gt;
&lt;li&gt;Dynamically-sized arrays and &lt;code&gt;mapping&lt;/code&gt;s are quite similar. In many cases, either can be used, and the decision comes down to what makes the code easier to read.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;further-reading&#34;&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/@hayeah/diving-into-the-ethereum-vm-the-hidden-costs-of-arrays-28e119f04a9b&#34;&gt;The Hidden Costs of Arrays&lt;/a&gt; compares Solidity arrays and &lt;code&gt;mapping&lt;/code&gt;s.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Writing a Token Auction Contract</title>
      <link>https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/</link>
      <pubDate>Tue, 20 Mar 2018 10:39:42 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/20/writing-a-token-auction-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a smart contract that will auction off ERC20 tokens to the highest bidder.  The post assumes you are familiar with techniques for how a contract deals with an ERC20 token contract, which we covered in our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/&#34;&gt;token sale post&lt;/a&gt;.
The post will briefly touch on some of the challenges around conducting auctions on the blockchain.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;There are many kinds of auctions, and this post will describe a contract that implements an
&lt;a href=&#34;https://en.wikipedia.org/wiki/English_auction&#34;&gt;English auction&lt;/a&gt;: bidders will alternate making higher and higher bids until there are no more bids, at which time the highest bid will be accepted in return for the good being sold.&lt;/p&gt;

&lt;h2 id=&#34;starting-the-auction&#34;&gt;Starting the Auction&lt;/h2&gt;

&lt;p&gt;An auction is typically parameterized by a few values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;good&lt;/strong&gt; being sold.  For this contract, that will be a given ERC20 token.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;reserve price&lt;/strong&gt; is the lowest acceptable bid.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;minimum increment&lt;/strong&gt; is the smallest amount that each successive bid must increase by.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;timeout period&lt;/strong&gt; is the amount of time that bidders have after a successful bid to make a new bid.  If no successful bids are made during that period, then the auction terminates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These values are easily captured in code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EnglishAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EnglishAuction&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more to come...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The contract must, of course, keep track of who the &lt;code&gt;seller&lt;/code&gt; is, which the constructor sets.&lt;/p&gt;

&lt;p&gt;For simplicity, I am assuming that the auction starts immediately upon creation, so the original &lt;code&gt;auctionEnd&lt;/code&gt; is set &lt;code&gt;timeoutPeriod&lt;/code&gt; in the future.&lt;/p&gt;

&lt;p&gt;This contract will operate on the assumption that the seller will transfer the tokens to it.  The seller&amp;rsquo;s transfer is not part of the contract itself, however, and must be done after contract deployment.  Bidders can check that the transfer has been done by querying the token&amp;rsquo;s &lt;code&gt;balanceOf&lt;/code&gt; value that corresponds to the contract&amp;rsquo;s address.  It is essential that bidders check this value so that they know how many tokens are guaranteed to be transferred to the winner.&lt;/p&gt;

&lt;h2 id=&#34;escrowed-funds&#34;&gt;Escrowed Funds&lt;/h2&gt;

&lt;p&gt;In a real-world auction, bidders are typically trusted to actually buy the auctioned good if they win the auction.  Smart contracts, on the other hand, don&amp;rsquo;t typically trust participants to make good on their promises.  Therefore, my auction contract will demand that all bids come with ether attached that will be used if the bid wins.&lt;/p&gt;

&lt;p&gt;Escrowed bids guarantee that the funds are available for the winner to pay, but they complicate the smart contract because now losing bidders must be able to recover their escrowed funds.  I will implement this with the simple pattern introduced in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;banking post&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;balanceOf&lt;/code&gt; mapping tracks the ether available to be withdrawn by any account, and &lt;code&gt;withdraw&lt;/code&gt; transfers that amount.  The function does not allow withdrawals from the current high bidder because their funds are escrowed.&lt;/p&gt;

&lt;p&gt;Note that the code does &lt;em&gt;not&lt;/em&gt; check to see if the auction is over&amp;mdash;losing bidders may withdraw their funds at any time.&lt;/p&gt;

&lt;h2 id=&#34;bids&#34;&gt;Bids&lt;/h2&gt;

&lt;p&gt;A successful bid must meet the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It must be made before the end of the auction.&lt;/li&gt;
&lt;li&gt;It must be at least the reserve amount.&lt;/li&gt;
&lt;li&gt;It must be at least the minimum increment over the current high bid.  (Before any bids have been accepted, the high bid is considered to be zero.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bids must have ether attached.  The &lt;code&gt;bid&lt;/code&gt; function will assume that the bidder is bidding all the attached ether and any previously escrowed funds.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;amount&lt;/code&gt; parameter is not strictly necessary, but I&amp;rsquo;ve put it there to protect bidders from making mistakes regarding the sum of the attached ether and escrowed ether.  The &lt;code&gt;amount&lt;/code&gt; declares their intended bid.&lt;/p&gt;

&lt;p&gt;One subtlety is that &lt;code&gt;balanceOf[highBidder]&lt;/code&gt; is the amount of the high bid.&lt;/p&gt;

&lt;h2 id=&#34;auction-end&#34;&gt;Auction End&lt;/h2&gt;

&lt;p&gt;An auction finishes in one of two states:  with or without a winning bid.  If the auction was unsuccessful, then the tokens need to be returned to the seller.  Otherwise, the tokens need to be transferred to the winning bidder and the winning bid needs to be made available to the seller.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer tokens to high bidder&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer ether balance to seller&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are a few notable things about &lt;code&gt;resolve&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function did not try to transfer ether directly to the seller.  That avoids potential problems if the seller is a badly behaving contract, which might prevent the high bidder from ever getting their tokens.&lt;/li&gt;
&lt;li&gt;The function did not try to transfer ether to the seller via &lt;code&gt;selfdestruct&lt;/code&gt;.  This is because there may still be losing bidders who have not yet retrieved their funds.&lt;/li&gt;
&lt;li&gt;Anybody can call &lt;code&gt;resolve&lt;/code&gt;&amp;mdash;it&amp;rsquo;s not limited to the seller or winning bidder.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;highBidder&lt;/code&gt; is set to zero to allow the seller to withdraw funds if they won their own auction.  It also reduces gas costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this contract used the indirect &lt;code&gt;approve&lt;/code&gt;/&lt;code&gt;transferFrom&lt;/code&gt; pattern, the &lt;code&gt;resolve&lt;/code&gt; would have been more complicated because it would have required logic to refund ether to the winning bidder in the case where &lt;code&gt;transferFrom&lt;/code&gt; fails due to lack of approval.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A smart contract can conduct an English auction.&lt;/li&gt;
&lt;li&gt;To ensure payment, bids must include an advance payment, which can be refunded should the bid not prevail.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contracts&#34;&gt;The Complete Contracts&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;englishauction.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IEVuZ2xpc2hBdWN0aW9uIHsKICAgIGFkZHJlc3Mgc2VsbGVyOwoKICAgIElFUkMyMFRva2VuIHB1YmxpYyB0b2tlbjsKICAgIHVpbnQyNTYgcHVibGljIHJlc2VydmVQcmljZTsKICAgIHVpbnQyNTYgcHVibGljIG1pbkluY3JlbWVudDsKICAgIHVpbnQyNTYgcHVibGljIHRpbWVvdXRQZXJpb2Q7CgogICAgdWludDI1NiBwdWJsaWMgYXVjdGlvbkVuZDsKCiAgICBmdW5jdGlvbiBFbmdsaXNoQXVjdGlvbigKICAgICAgICBJRVJDMjBUb2tlbiBfdG9rZW4sCiAgICAgICAgdWludDI1NiBfcmVzZXJ2ZVByaWNlLAogICAgICAgIHVpbnQyNTYgX21pbkluY3JlbWVudCwKICAgICAgICB1aW50MjU2IF90aW1lb3V0UGVyaW9kCiAgICApCiAgICAgICAgcHVibGljCiAgICB7CiAgICAgICAgdG9rZW4gPSBfdG9rZW47CiAgICAgICAgcmVzZXJ2ZVByaWNlID0gX3Jlc2VydmVQcmljZTsKICAgICAgICBtaW5JbmNyZW1lbnQgPSBfbWluSW5jcmVtZW50OwogICAgICAgIHRpbWVvdXRQZXJpb2QgPSBfdGltZW91dFBlcmlvZDsKCiAgICAgICAgc2VsbGVyID0gbXNnLnNlbmRlcjsKICAgICAgICBhdWN0aW9uRW5kID0gbm93ICsgdGltZW91dFBlcmlvZDsKICAgIH0KCiAgICBhZGRyZXNzIGhpZ2hCaWRkZXI7CgogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpIHB1YmxpYyBiYWxhbmNlT2Y7CgogICAgZnVuY3Rpb24gd2l0aGRyYXcoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciAhPSBoaWdoQmlkZGVyKTsKCiAgICAgICAgdWludDI1NiBhbW91bnQgPSBiYWxhbmNlT2ZbbXNnLnNlbmRlcl07CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9CgogICAgZXZlbnQgQmlkKGFkZHJlc3MgaGlnaEJpZGRlciwgdWludDI1NiBoaWdoQmlkKTsKCiAgICBmdW5jdGlvbiBiaWQodWludDI1NiBhbW91bnQpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICByZXF1aXJlKG5vdyA8IGF1Y3Rpb25FbmQpOwogICAgICAgIHJlcXVpcmUoYW1vdW50ID49IHJlc2VydmVQcmljZSk7CiAgICAgICAgcmVxdWlyZShhbW91bnQgPj0gYmFsYW5jZU9mW2hpZ2hCaWRkZXJdK21pbkluY3JlbWVudCk7CgogICAgICAgIGJhbGFuY2VPZlttc2cuc2VuZGVyXSArPSBtc2cudmFsdWU7CiAgICAgICAgcmVxdWlyZShiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPT0gYW1vdW50KTsKCiAgICAgICAgaGlnaEJpZGRlciA9IG1zZy5zZW5kZXI7CgogICAgICAgIGF1Y3Rpb25FbmQgPSBub3cgKyB0aW1lb3V0UGVyaW9kOwoKICAgICAgICBlbWl0IEJpZChoaWdoQmlkZGVyLCBhbW91bnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGF1Y3Rpb25FbmQpOwoKICAgICAgICB1aW50MjU2IHQgPSB0b2tlbi5iYWxhbmNlT2YodGhpcyk7CiAgICAgICAgaWYgKGhpZ2hCaWRkZXIgPT0gMCkgewogICAgICAgICAgICByZXF1aXJlKHRva2VuLnRyYW5zZmVyKHNlbGxlciwgdCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRva2VucyB0byBoaWdoIGJpZGRlcgogICAgICAgICAgICByZXF1aXJlKHRva2VuLnRyYW5zZmVyKGhpZ2hCaWRkZXIsIHQpKTsKCiAgICAgICAgICAgIC8vIHRyYW5zZmVyIGV0aGVyIGJhbGFuY2UgdG8gc2VsbGVyCiAgICAgICAgICAgIGJhbGFuY2VPZltzZWxsZXJdICs9IGJhbGFuY2VPZltoaWdoQmlkZGVyXTsKICAgICAgICAgICAgYmFsYW5jZU9mW2hpZ2hCaWRkZXJdID0gMDsKCiAgICAgICAgICAgIGhpZ2hCaWRkZXIgPSAwOwogICAgICAgIH0KICAgIH0KfQo=&#34; download=&#39;englishauction.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EnglishAuction&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;EnglishAuction&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;highBid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reservePrice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;minIncrement&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timeoutPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;auctionEnd&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer tokens to high bidder&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// transfer ether balance to seller&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

            &lt;span style=&#34;color: #586e75&#34;&gt;highBidder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Flipping a Coin in Ethereum</title>
      <link>https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/</link>
      <pubDate>Fri, 16 Mar 2018 11:09:36 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/16/flipping-a-coin-in-ethereum/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll describe how two parties can bet on a coin flip in an Ethereum smart contract by using a simple &lt;a href=&#34;https://en.wikipedia.org/wiki/Commitment_scheme&#34;&gt;commitment scheme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;

&lt;p&gt;In the real world, betting on a coin flip might happen like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Player 1 flips a coin and catches it on their arm, face down and covered. At this point, the outcome of the flip is already determined but kept secret.&lt;/li&gt;
&lt;li&gt;Player 2 chooses &amp;ldquo;heads&amp;rdquo; or &amp;ldquo;tails.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Player 1 reveals the outcome of the flip. If player 2 guessed it correctly, they win. Otherwise, player 1 wins.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;rsquo;ll model this interaction in Ethereum using a &lt;a href=&#34;https://en.wikipedia.org/wiki/Commitment_scheme&#34;&gt;commitment scheme&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Player 1 will &lt;em&gt;commit&lt;/em&gt; to a boolean value (representing &amp;ldquo;heads&amp;rdquo; or &amp;ldquo;tails&amp;rdquo;), keeping the chosen value secret.&lt;/li&gt;
&lt;li&gt;Player 2 will guess at that boolean value.&lt;/li&gt;
&lt;li&gt;Player 1 will &lt;em&gt;reveal&lt;/em&gt; the original boolean value.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;committing-with-a-hash&#34;&gt;Committing with a Hash&lt;/h2&gt;

&lt;p&gt;There are many different commitment schemes, but the simplest and easiest to implement in an Ethereum smart contract uses a cryptographic hash function. To commit to a message, the committer just shares the hash of that message. When the message is later revealed, anyone can easily verify that its hash matches the hash shared earlier.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cryptographic_hash_function&#34;&gt;Cryptographic hash functions&lt;/a&gt; have a few important properties that make them suitable for commitment schemes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They are deterministic, so a hash of a message can later be verified by hashing the message again.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s infeasible to find two different messages that hash to the same value, so a hash is truly a commitment to a single message.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s impossible to generate a message from its hash more efficiently than trying all possible messages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point has a corollary: if the number of possible messages is small, it&amp;rsquo;s &lt;em&gt;easy&lt;/em&gt; to reverse a hash. For the coin flip example, player 1 needs to commit to a boolean. Just hashing that boolean (&lt;code&gt;hash(0)&lt;/code&gt; or &lt;code&gt;hash(1)&lt;/code&gt;) would be trivial to reverse because there are only two possible inputs.&lt;/p&gt;

&lt;p&gt;A simple way to make guessing infeasible is to add a large random &lt;em&gt;nonce&lt;/em&gt; to the message being hashed. In the &lt;code&gt;CoinFlip&lt;/code&gt; contract, I&amp;rsquo;ll hash a boolean along with a 32-byte nonce.&lt;/p&gt;

&lt;h2 id=&#34;offering-a-bet&#34;&gt;Offering a Bet&lt;/h2&gt;

&lt;p&gt;The first player offers a bet by deploying the &lt;code&gt;CoinFlip&lt;/code&gt; contract.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CoinFlip&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1Commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CoinFlip&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1Commitment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By deploying the contract, the first player escrows their bet and commits to a boolean value representing heads or tails. The commitment is the keccak-256 hash of the boolean value and a 32-byte nonce. The boolean and nonce are kept secret and used later in the reveal phase.&lt;/p&gt;

&lt;p&gt;As an example, the commitment hash could be computed using Node.js and &lt;a href=&#34;https://github.com/ethereumjs/ethereumjs-abi&#34;&gt;&lt;code&gt;ethereumjs-abi&lt;/code&gt;&lt;/a&gt; as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;abi&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;require(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;ethereumjs-abi&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;crypto&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;require(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;crypto&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// This could come from user input or be randomly generated.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;secretChoice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;nonce&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;crypto.randomBytes(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;abi.soliditySHA3(&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;bool&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;[secretChoice,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;nonce]).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;taking-a-bet&#34;&gt;Taking a Bet&lt;/h2&gt;

&lt;p&gt;The second player takes the bet by calling &lt;code&gt;takeBet&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2Choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// effectively infinite&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;takeBet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;player2Choice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;hours&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;expiration&lt;/code&gt; starts off at 2&lt;sup&gt;256&lt;/sup&gt;-1, the maximum value for a &lt;code&gt;uint256&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Only one account is allowed to take the bet. &lt;code&gt;require(player2 == 0)&lt;/code&gt; ensures that no other account has already taken the bet.&lt;/li&gt;
&lt;li&gt;The second player must match the first player&amp;rsquo;s bet.&lt;/li&gt;
&lt;li&gt;The second player bets on either heads or tails by simply passing a boolean. There&amp;rsquo;s no need to keep this value a secret, as the first player has already committed to their choice.&lt;/li&gt;
&lt;li&gt;When the second player takes the bet, a timeout is started. The first player has until the end of that timeout to reveal their secret, after which their bet is forfeit. Without this timeout, the first player could refuse to reveal a losing secret and prevent the second player from collecting their winnings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;revealing-the-flip&#34;&gt;Revealing the Flip&lt;/h2&gt;

&lt;p&gt;Once the second player has made their bet, the first player can settle the bet by revealing the original choice (heads or tails) and nonce. The two combined are the preimage of the commitment hash.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reveal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1Commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2Choice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;reveal&lt;/code&gt; can only be called once the bet is taken and only before the &lt;code&gt;expiration&lt;/code&gt; has been reached.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;choice&lt;/code&gt; and &lt;code&gt;nonce&lt;/code&gt; must satisfy the commitment made when the contract was deployed. This ensures that the first player cannot cheat.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;player2&lt;/code&gt; wins if they successfully chose the same value as &lt;code&gt;player1&lt;/code&gt;. Otherwise, &lt;code&gt;player1&lt;/code&gt; wins.&lt;/li&gt;
&lt;li&gt;All ether is immediately transferred to the winner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You may be surprised to see that there are no restrictions on which account can call this function. Only the correct original choice will produce the commitment hash, so it doesn&amp;rsquo;t matter who supplies it.&lt;/p&gt;

&lt;h2 id=&#34;refusing-to-reveal&#34;&gt;Refusing to Reveal&lt;/h2&gt;

&lt;p&gt;If the first player refuses to reveal their choice, their bet is forfeit. The second player can claim their prize by calling &lt;code&gt;claimTimeout&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As with &lt;code&gt;reveal&lt;/code&gt;, it doesn&amp;rsquo;t matter who calls this function.&lt;/p&gt;

&lt;h2 id=&#34;canceling-a-bet&#34;&gt;Canceling a Bet&lt;/h2&gt;

&lt;p&gt;If no one takes the bet, it should be possible for the first player to cancel the bet and reclaim their ether.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The two &lt;code&gt;require&lt;/code&gt;s ensure that only the first player can cancel the offered bet and that they can only do so if no one has taken the bet yet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;betAmount = 0&lt;/code&gt; ensures that if someone sends ether to &lt;code&gt;takeBet&lt;/code&gt; after the offer has been canceled, their bet will be rejected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;why-not-use-selfdestruct&#34;&gt;Why Not Use &lt;code&gt;selfdestruct&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;It&amp;rsquo;s tempting to use &lt;code&gt;selfdestruct&lt;/code&gt; to distribute ether and clean up the contract when the bet is settled or canceled. However, this could lead to an unfortunate race condition.&lt;/p&gt;

&lt;p&gt;When a contract calls &lt;code&gt;selfdestruct&lt;/code&gt;, its code is deleted. This makes it work much like an externally owned account (EOA). Any transaction sent to it will be accepted, including those with attached ether.&lt;/p&gt;

&lt;p&gt;The following scenario is an example of why this is a problem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Player 1 deploys a new &lt;code&gt;CoinFlip&lt;/code&gt; contract.&lt;/li&gt;
&lt;li&gt;Player 2 submits a transaction to call &lt;code&gt;takeBet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;While that transaction is still pending, player 1 calls &lt;code&gt;cancel&lt;/code&gt;. (Imagine that &lt;code&gt;cancel&lt;/code&gt; is implemented with &lt;code&gt;selfdestruct&lt;/code&gt;.)&lt;/li&gt;
&lt;li&gt;Player 2&amp;rsquo;s &lt;code&gt;takeBet&lt;/code&gt; transaction arrives.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because the contract has been destroyed, there&amp;rsquo;s no code to revert that late transaction. The ether attached is transferred to the contract and locked in there forever.&lt;/p&gt;

&lt;p&gt;As a generalization, it&amp;rsquo;s a bad idea to use &lt;code&gt;selfdestruct&lt;/code&gt; on a contract that accepts ether.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href=&#34;https://en.wikipedia.org/wiki/Commitment_scheme&#34;&gt;commitment scheme&lt;/a&gt; is a way to commit to a secret choice and reveal it later without the possibility of changing it.&lt;/li&gt;
&lt;li&gt;Hash functions can be reversed only by guessing the preimage.&lt;/li&gt;
&lt;li&gt;A nonce is a good way to ensure that a hash preimage cannot be guessed.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s important to consider what happens if the committer refuses to reveal their secret.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;coinflip.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBDb2luRmxpcCB7CiAgICBhZGRyZXNzIHB1YmxpYyBwbGF5ZXIxOwogICAgYnl0ZXMzMiBwdWJsaWMgcGxheWVyMUNvbW1pdG1lbnQ7CgogICAgdWludDI1NiBwdWJsaWMgYmV0QW1vdW50OwoKICAgIGFkZHJlc3MgcHVibGljIHBsYXllcjI7CiAgICBib29sIHB1YmxpYyBwbGF5ZXIyQ2hvaWNlOwoKICAgIHVpbnQyNTYgcHVibGljIGV4cGlyYXRpb24gPSAyKioyNTYtMTsKCiAgICBmdW5jdGlvbiBDb2luRmxpcChieXRlczMyIGNvbW1pdG1lbnQpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICBwbGF5ZXIxID0gbXNnLnNlbmRlcjsKICAgICAgICBwbGF5ZXIxQ29tbWl0bWVudCA9IGNvbW1pdG1lbnQ7CiAgICAgICAgYmV0QW1vdW50ID0gbXNnLnZhbHVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHBsYXllcjEpOwogICAgICAgIHJlcXVpcmUocGxheWVyMiA9PSAwKTsKCiAgICAgICAgYmV0QW1vdW50ID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGFrZUJldChib29sIGNob2ljZSkgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUocGxheWVyMiA9PSAwKTsKICAgICAgICByZXF1aXJlKG1zZy52YWx1ZSA9PSBiZXRBbW91bnQpOwoKICAgICAgICBwbGF5ZXIyID0gbXNnLnNlbmRlcjsKICAgICAgICBwbGF5ZXIyQ2hvaWNlID0gY2hvaWNlOwoKICAgICAgICBleHBpcmF0aW9uID0gbm93ICsgMjQgaG91cnM7CiAgICB9CgogICAgZnVuY3Rpb24gcmV2ZWFsKGJvb2wgY2hvaWNlLCB1aW50MjU2IG5vbmNlKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUocGxheWVyMiAhPSAwKTsKICAgICAgICByZXF1aXJlKG5vdyA8IGV4cGlyYXRpb24pOwoKICAgICAgICByZXF1aXJlKGtlY2NhazI1NihjaG9pY2UsIG5vbmNlKSA9PSBwbGF5ZXIxQ29tbWl0bWVudCk7CgogICAgICAgIGlmIChwbGF5ZXIyQ2hvaWNlID09IGNob2ljZSkgewogICAgICAgICAgICBwbGF5ZXIyLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGxheWVyMS50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbGFpbVRpbWVvdXQoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGV4cGlyYXRpb24pOwoKICAgICAgICBwbGF5ZXIyLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICB9Cn0K&#34; download=&#39;coinflip.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CoinFlip&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1Commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player2Choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CoinFlip&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player1Commitment&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;takeBet&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;betAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;player2Choice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;24&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;hours&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;reveal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;player1Commitment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;player2Choice&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;choice&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;player1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;player2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing an ERC20 Pawnshop Contract</title>
      <link>https://programtheblockchain.com/posts/2018/03/13/writing-an-erc20-pawnshop-contract/</link>
      <pubDate>Tue, 13 Mar 2018 06:11:09 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/13/writing-an-erc20-pawnshop-contract/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a pawnshop-like smart contract that will lend ether to anybody willing to provide  ERC20 tokens as collateral.  The post adopts and generalizes techniques that we covered in our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;collateralized-loan post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The collateralized loan post described a simple take-it-or-leave-it borrower-driven offer.  The borrower offered a set token amount as collateral with given loan terms and waited for a lender to meet those exact terms. The contract in this post will be lender-driven instead, and it will allow multiple borrowers. Each borrower will choose how many tokens to use as collateral and will receive ether proportionally. By serving multiple borrowers, the contract acts like a blockchain-based pawnshop.&lt;/p&gt;

&lt;h2 id=&#34;the-pawnshop-contract&#34;&gt;The Pawnshop Contract&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;PawnShop&lt;/code&gt; contract will handle the creation of loans to any account that puts up tokens as collateral.  This contract will be parameterized with the following values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ERC20 &lt;strong&gt;token&lt;/strong&gt; that the pawnshop accepts as collateral.  To keep things simple, I assume that a pawnshop contract only accepts one kind of token.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;loan&lt;/strong&gt; amount, which is the amount of wei per token unit that the pawnshop is willing to lend in exchange for holding  tokens as collateral.  This is given as a rational number&amp;mdash;see
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/27/writing-a-token-market-contract/&#34;&gt;the token market post&lt;/a&gt;
for details.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;payoff&lt;/strong&gt; amount, which is the amount of wei per token unit that the borrower must pay the pawnshop to reclaim its tokens.  This is also given as a rational number.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;loan&amp;rsquo;s duration&lt;/strong&gt; during which the borrower can pay off its loan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping track of these in the pawnshop is straightforward:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanWeiPerUnit&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffWeiPerUnit&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoffNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// avoid overflow&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A few things to note about the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;ve referenced an &lt;code&gt;IERC20Token&lt;/code&gt; interface for storing the address of the token.  This was discussed in
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/&#34;&gt;token sale post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PawnShop&lt;/code&gt; inherits from Mortal
(&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/20/writing-an-estate-planning-contract/&#34;&gt;introduced previously&lt;/a&gt;), which means that it will have an owner, and that the owner can kill the contract at will.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Mortal&lt;/code&gt; inheritance hides the fact that &lt;code&gt;owner&lt;/code&gt; will automatically be set upon creation to the account that deployed the contract.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Rational&lt;/code&gt; struct holds wei/unit values for the loan and ultimate payoff.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Rational&lt;/code&gt; wei/unit values cannot be passed as structs due to (temporary?) limitations of the Solidity compiler, so they are passed as individual values that are reconstituted in the constructor.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;multiply&lt;/code&gt; routine implements multiplying by a rational number.  The code checks for overflow to avoid a potential vulnerability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;creating-a-loan-contract&#34;&gt;Creating a Loan Contract&lt;/h2&gt;

&lt;p&gt;I will use the &lt;code&gt;Loan&lt;/code&gt; contract unchanged from the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;collateralized-loan post&lt;/a&gt; to keep track of individual loans created by the pawnshop.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;PawnShop&lt;/code&gt; contract will fulfill loan requests with the &lt;code&gt;pawnTokens&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanCreated&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;etherDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pawnTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalLoan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPayoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoffWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;totalPayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalLoan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanCreated&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unitQuantity&lt;/code&gt; is the amount (in units) of tokens that the borrower wishes to use as collateral.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;address loan = new Loan(...)&lt;/code&gt; deploys a new &lt;code&gt;Loan&lt;/code&gt; contract for this loan.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;token.transferFrom(...)&lt;/code&gt; transfers the tokens from the borrower to the loan contract.&lt;/li&gt;
&lt;li&gt;The loaned ether is sent to the borrower.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;LoanCreated&lt;/code&gt; event signals to the borrower and lender that the loan has been created and lets them know the address of the deployed &lt;code&gt;Loan&lt;/code&gt; contract.  (The borrower needs the address to pay off the loan, and the lender may need it to repossess the tokens.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code above is deceptively simple, and it hides a few very important details, which must be noted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;How does the borrower know that the contract has enough ether to pay it?&lt;/em&gt;  If the contract had insufficient funds, the &lt;code&gt;msg.sender.transfer(totalLoan)&lt;/code&gt; would fail, which would cause the whole transaction to fail.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;If the transaction fails, and the borrower doesn&amp;rsquo;t get ether, what happens to its tokens?&lt;/em&gt;  Nothing happens to them.  The borrower only &lt;em&gt;approved&lt;/em&gt; a transfer, and the transfer didn&amp;rsquo;t happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the &lt;code&gt;Loan&lt;/code&gt; contract has been deployed, it functions exactly as described in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;collateralized-loan post&lt;/a&gt;, and it has no subsequent interactions with the &lt;code&gt;PawnShop&lt;/code&gt; contract.&lt;/p&gt;

&lt;h2 id=&#34;note&#34;&gt;Note&lt;/h2&gt;

&lt;p&gt;I made &lt;code&gt;PawnShop&lt;/code&gt; mortal so that the owner could choose to kill it and recoup any leftover ether.  This is essential to protecting the owner&amp;rsquo;s ability to stop making loans if the value of the the tokens changes significantly.&lt;/p&gt;

&lt;p&gt;An important concern whenever you see a contract that can be killed is whether or not that functionality creates unexpected consequences.  In this scenario, the question is whether killing the pawnshop contract creates any problems with already-deployed loan contracts.&lt;/p&gt;

&lt;p&gt;Inspecting the &lt;code&gt;Loan&lt;/code&gt; contract code makes it clear that the &lt;code&gt;Loan&lt;/code&gt; contracts do not depend in any way on the continued existence of the &lt;code&gt;PawnShop&lt;/code&gt; contract.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;PawnShop&lt;/code&gt; contract allows a single lender to offer loans on fixed terms to potentially many borrowers.&lt;/li&gt;
&lt;li&gt;Borrowers choose how many tokens to offer as collateral and receive ether proportionally.&lt;/li&gt;
&lt;li&gt;Rational numbers support arbitrary rates in the loan terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;p&gt;The complete code for the &lt;code&gt;PawnShop&lt;/code&gt; contract is below.  I&amp;rsquo;ve used Solidity&amp;rsquo;s &lt;code&gt;import&lt;/code&gt; directive to indicate that the code for &lt;code&gt;IERC20Token&lt;/code&gt; and &lt;code&gt;Loan&lt;/code&gt; will be loaded from separate files.  (They were presented in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/&#34;&gt;collateralized-loan post&lt;/a&gt;.)&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;pawnshop.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKaW1wb3J0ICIuL2xvYW4uc29sIjsKCmNvbnRyYWN0IE93bmFibGUgewogICAgYWRkcmVzcyBvd25lciA9IG1zZy5zZW5kZXI7CiAgICBtb2RpZmllciBvbmx5T3duZXIgewogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBvd25lcik7CiAgICAgICAgXzsKICAgIH0KfQoKY29udHJhY3QgTW9ydGFsIGlzIE93bmFibGUgewogICAgZnVuY3Rpb24ga2lsbCgpIHB1YmxpYyBvbmx5T3duZXIgewogICAgICAgIHNlbGZkZXN0cnVjdChtc2cuc2VuZGVyKTsKICAgIH0KfQoKY29udHJhY3QgUGF3blNob3AgaXMgTW9ydGFsIHsKICAgIHN0cnVjdCBSYXRpb25hbCB7CiAgICAgICAgdWludDI1NiBudW1lcmF0b3I7CiAgICAgICAgdWludDI1NiBkZW5vbWluYXRvcjsKICAgIH0KCiAgICBJRVJDMjBUb2tlbiBwdWJsaWMgdG9rZW47CiAgICBSYXRpb25hbCBwdWJsaWMgbG9hbldlaVBlclVuaXQ7CiAgICBSYXRpb25hbCBwdWJsaWMgcGF5b2ZmV2VpUGVyVW5pdDsKICAgIHVpbnQyNTYgcHVibGljIGxvYW5EdXJhdGlvbjsKCiAgICBmdW5jdGlvbiBQYXduU2hvcCgKICAgICAgICBhZGRyZXNzIGxlbmRlciwKICAgICAgICBJRVJDMjBUb2tlbiBfdG9rZW4sCiAgICAgICAgdWludDI1NiBsb2FuTnVtZXJhdG9yLAogICAgICAgIHVpbnQyNTYgbG9hbkRlbm9taW5hdG9yLAogICAgICAgIHVpbnQyNTYgcGF5b2ZmTnVtZXJhdG9yLAogICAgICAgIHVpbnQyNTYgcGF5b2ZmRGVub21pbmF0b3IsCiAgICAgICAgdWludDI1NiBfbG9hbkR1cmF0aW9uCiAgICApCiAgICAgICAgcHVibGljCiAgICAgICAgcGF5YWJsZQogICAgewogICAgICAgIG93bmVyID0gbGVuZGVyOwogICAgICAgIHRva2VuID0gX3Rva2VuOwogICAgICAgIGxvYW5XZWlQZXJVbml0ID0gUmF0aW9uYWwobG9hbk51bWVyYXRvciwgbG9hbkRlbm9taW5hdG9yKTsKICAgICAgICBwYXlvZmZXZWlQZXJVbml0ID0gUmF0aW9uYWwocGF5b2ZmTnVtZXJhdG9yLCBwYXlvZmZEZW5vbWluYXRvcik7CiAgICAgICAgbG9hbkR1cmF0aW9uID0gX2xvYW5EdXJhdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBtdWx0aXBseShSYXRpb25hbCByLCB1aW50MjU2IHgpIGludGVybmFsIHB1cmUgcmV0dXJucyAodWludDI1NikgewogICAgICAgIGlmICh4ID09IDApIHsgcmV0dXJuIDA7IH0KICAgICAgICB1aW50MjU2IHYgPSB4ICogci5udW1lcmF0b3I7CiAgICAgICAgYXNzZXJ0KHYgLyB4ID09IHIubnVtZXJhdG9yKTsgIC8vIGF2b2lkIG92ZXJmbG93CiAgICAgICAgcmV0dXJuIHYgLyByLmRlbm9taW5hdG9yOwogICAgfQoKICAgIGV2ZW50IExvYW5DcmVhdGVkKAogICAgICAgIGFkZHJlc3MgbG9hbiwKICAgICAgICBhZGRyZXNzIGluZGV4ZWQgYm9ycm93ZXIsCiAgICAgICAgSUVSQzIwVG9rZW4gdG9rZW4sCiAgICAgICAgdWludDI1NiB0b2tlbkFtb3VudCwKICAgICAgICB1aW50MjU2IGV0aGVyRHVlLAogICAgICAgIHVpbnQyNTYgZHVlRGF0ZQogICAgKTsKCiAgICBmdW5jdGlvbiBwYXduVG9rZW5zKHVpbnQyNTYgdW5pdFF1YW50aXR5KSBwdWJsaWMgewogICAgICAgIHVpbnQyNTYgdG90YWxMb2FuID0gbXVsdGlwbHkobG9hbldlaVBlclVuaXQsIHVuaXRRdWFudGl0eSk7CiAgICAgICAgdWludDI1NiB0b3RhbFBheW9mZiA9IG11bHRpcGx5KHBheW9mZldlaVBlclVuaXQsIHVuaXRRdWFudGl0eSk7CiAgICAgICAgYWRkcmVzcyBsb2FuID0gbmV3IExvYW4ob3duZXIsIG1zZy5zZW5kZXIsIHRva2VuLCB1bml0UXVhbnRpdHksCiAgICAgICAgICAgIHRvdGFsUGF5b2ZmLCBsb2FuRHVyYXRpb24pOwogICAgICAgIHJlcXVpcmUodG9rZW4udHJhbnNmZXJGcm9tKG1zZy5zZW5kZXIsIGxvYW4sIHVuaXRRdWFudGl0eSkpOwogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIodG90YWxMb2FuKTsKCiAgICAgICAgZW1pdCBMb2FuQ3JlYXRlZChsb2FuLCBtc2cuc2VuZGVyLCB0b2tlbiwgdW5pdFF1YW50aXR5LCB0b3RhbFBheW9mZiwKICAgICAgICAgICAgbm93K2xvYW5EdXJhdGlvbik7CiAgICB9CgogICAgZnVuY3Rpb24gZGVwb3NpdCgpIHB1YmxpYyBwYXlhYmxlIHt9ICAvLyBlbmFibGUgb3duZXIgdG8gYWRkIG1vcmUgZXRoZXIKfQo=&#34; download=&#39;pawnshop.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./loan.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Ownable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Ownable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;kill&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;PawnShop&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanWeiPerUnit&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffWeiPerUnit&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoffNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Rational&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// avoid overflow&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanCreated&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;etherDue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pawnTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalLoan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPayoff&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;multiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;payoffWeiPerUnit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;totalPayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;totalLoan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanCreated&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitQuantity&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalPayoff&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{}&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// enable owner to add more ether&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Understanding Ethereum Smart Contract Storage</title>
      <link>https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/</link>
      <pubDate>Fri, 09 Mar 2018 06:45:17 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/</guid>
      <description>&lt;p&gt;Ethereum smart contracts use an uncommon storage model that often confuses new developers. In this post, I&amp;rsquo;ll describe that storage model and explain how the Solidity programming language makes use of it.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;one-astronomically-large-array&#34;&gt;One Astronomically Large Array&lt;/h2&gt;

&lt;p&gt;Each smart contract running in the Ethereum Virtual Machine (EVM) maintains state in its own permanent storage. This storage can be thought of as a very large array, initially full of zeros. Each value in the array is 32-bytes wide, and there are 2&lt;sup&gt;256&lt;/sup&gt; such values. A smart contract can read from or write to a value at any location. That&amp;rsquo;s the extent of the storage interface.&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/storage/storage.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/storage/storage.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;p&gt;I encourage you to stick with the &amp;ldquo;astronomically large array&amp;rdquo; mental model, but be aware that this is not how storage is implemented on the physical computers that make up the Ethereum network. Storage is extremely sparsely populated, and there&amp;rsquo;s no need to store the zeros. A key/value store mapping 32-byte keys to 32-byte values will do the job nicely. An absent key is simply defined as mapping to the value zero.&lt;/p&gt;

&lt;p&gt;Because zeros don&amp;rsquo;t take up any space, storage can be reclaimed by setting a value to zero. This is incentivized in smart contracts with a &lt;em&gt;gas refund&lt;/em&gt; when you change a value to zero.&lt;/p&gt;

&lt;h2 id=&#34;locating-fixed-sized-values&#34;&gt;Locating Fixed-Sized Values&lt;/h2&gt;

&lt;p&gt;In this storage model, where do things actually go? For known variables with fixed sizes, it makes sense to just give them reserved locations in storage. The Solidity programming language does just that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StorageTest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt; is stored at &lt;em&gt;slot&lt;/em&gt; 0. (Solidity&amp;rsquo;s term for a location within storage is a &amp;ldquo;slot.&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;b&lt;/code&gt; is stored at slots 1, and 2 (one for each element of the array).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&lt;/code&gt; starts at slot 3 and consumes two slots, because the &lt;code&gt;Entry&lt;/code&gt; struct stores two 32-byte values.&lt;/li&gt;
&lt;/ul&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/storage/fixed.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/storage/fixed.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;p&gt;These slots are determined at compile time, strictly based on the order in which the variables appear in the contract code.&lt;/p&gt;

&lt;h2 id=&#34;locating-dynamically-sized-values&#34;&gt;Locating Dynamically-Sized Values&lt;/h2&gt;

&lt;p&gt;Using reserved slots works well for fixed-size state variables, but it doesn&amp;rsquo;t work for dynamically-sized arrays and &lt;code&gt;mapping&lt;/code&gt;s because there&amp;rsquo;s no way of knowing how many slots to reserve.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re thinking of computer RAM or hard drive as an analogy, you might expect that there&amp;rsquo;s an &amp;ldquo;allocation&amp;rdquo; step to find free space to use and then a &amp;ldquo;release&amp;rdquo; step to put that space back into the pool of available storage.&lt;/p&gt;

&lt;p&gt;This is unnecessary due to the astronomical scale of smart contract storage. There are 2&lt;sup&gt;256&lt;/sup&gt; locations to choose from in storage, which is approximately the number of atoms in the known, observable universe. You could choose storage locations at random without ever experiencing a collision. The locations you chose would be so far apart that you could store as much data as you wanted at each location without running into the next one.&lt;/p&gt;

&lt;p&gt;Of course, choosing locations at random wouldn&amp;rsquo;t be very helpful, because you would have no way to find the data again. Solidity instead uses a hash function to uniformly and repeatably compute locations for dynamically-sized values.&lt;/p&gt;

&lt;h3 id=&#34;dynamically-sized-arrays&#34;&gt;Dynamically-Sized Arrays&lt;/h3&gt;

&lt;p&gt;A dynamically-sized array needs a place to store its size as well as its elements.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StorageTest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 0&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slots 1-2&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;       &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slots 3-4&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the above code, the dynamically-sized array &lt;code&gt;d&lt;/code&gt; is at slot 5, but the only thing that&amp;rsquo;s stored there is the &lt;em&gt;size&lt;/em&gt; of &lt;code&gt;d&lt;/code&gt;. The values in the array are stored consecutively starting at the &lt;em&gt;hash&lt;/em&gt; of the slot.&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/storage/dynamic.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/storage/dynamic.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;p&gt;The following Solidity function computes the location of an element of a dynamically-sized array:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arrLocation&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;slot&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;elementSize&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;slot&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;elementSize&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;mappings&#34;&gt;Mappings&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;mapping&lt;/code&gt; requires an efficient way to find the location corresponding to a given key. Hashing the key is a good start, but care must be taken to make sure different &lt;code&gt;mapping&lt;/code&gt;s generate different locations.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StorageTest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 0&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slots 1-2&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;       &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slots 3-4&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 5 for length, keccak256(5)+ for data&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the above code, the &amp;ldquo;location&amp;rdquo; for &lt;code&gt;e&lt;/code&gt; is slot 6, and the location for &lt;code&gt;f&lt;/code&gt; is slot 7, but nothing is actually stored at those locations. (There&amp;rsquo;s no length to be stored, and individual values need to be located elsewhere.)&lt;/p&gt;

&lt;p&gt;To find the location of a specific value within a &lt;code&gt;mapping&lt;/code&gt;, the key and the &lt;code&gt;mapping&lt;/code&gt;&amp;rsquo;s slot are hashed together.&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/storage/mapping.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/storage/mapping.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;p&gt;The following Solidity function computes the location of a value:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;mapLocation&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;slot&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;slot&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that when &lt;code&gt;keccak256&lt;/code&gt; is called with multiple parameters, the parameters are concatenated together before hashing. Because the slot and key are both inputs to the hash function, there aren&amp;rsquo;t collisions between different &lt;code&gt;mapping&lt;/code&gt;s.&lt;/p&gt;

&lt;h3 id=&#34;combinations-of-complex-types&#34;&gt;Combinations of Complex Types&lt;/h3&gt;

&lt;p&gt;Dynamically-sized arrays and &lt;code&gt;mapping&lt;/code&gt;s can be nested within each other recursively. When that happens, the location of a value is found by recursively applying the calculations defined above. This sounds more complex than it is.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StorageTest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 0&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slots 1-2&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;       &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slots 3-4&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Entry&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 5 for length, keccak256(5)+ for data&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 6, data at h(k . 6)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 7, data at h(k . 7)&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[])&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 8&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;h&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// slot 9&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To find items within these complex types, we can use the functions defined above. To find &lt;code&gt;g[123][0]&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first find arr = g[123]&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;arrLoc&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;mapLocation&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;123&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// g is at slot 8&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// then find arr[0]&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;itemLoc&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arrLocation&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;arrLoc&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To find &lt;code&gt;h[2][456]&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first find map = h[2]&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;mapLoc&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;arrLocation&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// h is at slot 9&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// then find map[456]&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;itemLoc&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;mapLocation&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;mapLoc&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;456&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Each smart contract has storage in the form of an array of 2&lt;sup&gt;256&lt;/sup&gt; 32-byte values, all initialized to zero.&lt;/li&gt;
&lt;li&gt;Zeros are not explicitly stored, so setting a value to zero reclaims that storage.&lt;/li&gt;
&lt;li&gt;Solidity locates fixed-size values at reserved locations called &lt;em&gt;slots&lt;/em&gt;, starting at slot 0.&lt;/li&gt;
&lt;li&gt;Solidity exploits the sparseness of storage and the uniform distribution of hash outputs to safely locate dynamically-sized values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following table shows how storage locations are computed for different types. The &amp;ldquo;slot&amp;rdquo; refers to the next available slot when the state variable is encountered at compile time, and a dot indicates binary concatenation:&lt;/p&gt;

&lt;table class=&#34;pv3 f5 w-100&#34; cellspacing=&#34;0&#34;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th class=&#34;bb b--black-20 tl pb3 pr3&#34;&gt;Kind&lt;/th&gt;
            &lt;th class=&#34;bb b--black-20 tl pb3 pr3&#34;&gt;Declaration&lt;/th&gt;
            &lt;th class=&#34;bb b--black-20 tl pb3 pr3&#34;&gt;Value&lt;/th&gt;
            &lt;th class=&#34;bb b--black-20 tl pb3 pr3&#34;&gt;Location&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;Simple variable&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;code&gt;T v&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;code&gt;v&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;v&#39;s slot&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;Fixed-size array&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;code&gt;T[10] v&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;code&gt;v[n]&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;(v&#39;s slot) + n * (size of T)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&#34;pv3 pr3&#34;&gt;Dynamic array&lt;/td&gt;
            &lt;td class=&#34;pt3 pr3&#34;&gt;&lt;code&gt;T[] v&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pt3 pr3&#34;&gt;&lt;code&gt;v[n]&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pt3 pr3&#34;&gt;keccak256(v&#39;s slot) + n * (size of T)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;&lt;code&gt;v.length&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3 bb b--black-20&#34;&gt;v&#39;s slot&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&#34;pv3 pr3&#34;&gt;Mapping&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3&#34;&gt;&lt;code&gt;mapping(T1 =&gt; T2) v&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3&#34;&gt;&lt;code&gt;v[key]&lt;/code&gt;&lt;/td&gt;
            &lt;td class=&#34;pv3 pr3&#34;&gt;keccak256(key . (v&#39;s slot))&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;further-reading&#34;&gt;Further Reading&lt;/h2&gt;

&lt;p&gt;If you&amp;rsquo;d like to learn more, I recommend the following resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Solidity documentation covers the &lt;a href=&#34;https://solidity.readthedocs.io/en/v0.4.20/miscellaneous.html#layout-of-state-variables-in-storage&#34;&gt;layout of state variables in storage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/@hayeah&#34;&gt;Howard&lt;/a&gt;&amp;rsquo;s excellent series on the EVM includes two relevant parts: &lt;a href=&#34;https://medium.com/@hayeah/diving-into-the-ethereum-vm-part-2-storage-layout-bc5349cb11b7&#34;&gt;Storage Layout&lt;/a&gt; and &lt;a href=&#34;https://medium.com/@hayeah/diving-into-the-ethereum-vm-the-hidden-costs-of-arrays-28e119f04a9b&#34;&gt;The Hidden Costs of Arrays&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Writing a Collateralized Loan Contract</title>
      <link>https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/</link>
      <pubDate>Tue, 06 Mar 2018 07:13:04 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/06/writing-a-collateralized-loan-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post will demonstrate how to write a smart contract that will administer an ether loan while holding ERC20 tokens as collateral.  The post assumes you are familiar with techniques for how a contract deals with an ERC20 token contract, which we covered in our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/&#34;&gt;token sale post&lt;/a&gt;.  The post introduces the technique of having a smart contract deploy a second contract to carry out future work.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Borrowing ether using ERC20 tokens as collateral is an example transaction that a smart contract can broker easily.  To keep payments really simple, I will assume that loans are paid off with a single ether payment that must be made before a given deadline.&lt;/p&gt;

&lt;p&gt;For instance, at the time of this writing, one
&lt;a href=&#34;https://coinmarketcap.com/currencies/augur/&#34;&gt;REP&lt;/a&gt;
token is worth about 0.05 ETH, so a lender might be happy to lend 0.03 ETH for a couple weeks to a borrower willing to transfer 1.0 REP as collateral.  The lender would do this because the collateral is worth substantially more than the amount of the loan, so the lender would expect to come out okay if forced to repossess the collateral upon default.&lt;/p&gt;

&lt;p&gt;I am going to use two different contracts to orchestrate these financial transactions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The borrower will deploy a &lt;em&gt;loan request contract&lt;/em&gt; that will handle the tokens-for-ether exchange that represents the start of the loan.  This contract represents the borrower&amp;rsquo;s request to borrow ether on specified terms.&lt;/li&gt;
&lt;li&gt;When a lender accepts the terms, a &lt;em&gt;loan contract&lt;/em&gt; will be created. This loan contract holds the collateral tokens and enforces the terms of the loan until the borrower either pays off the loan or defaults by missing the payment deadline.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;why-two-contracts&#34;&gt;Why Two Contracts?&lt;/h2&gt;

&lt;p&gt;This design is a little more complicated than strictly necessary&amp;mdash;it&amp;rsquo;s possible to handle this loan with a single contract that both initiates the loan and that handles its ultimate disposition.  I&amp;rsquo;ve chosen to use the two-contract design for two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I wanted to illustrate a contract being deployed by another contract, which is a very powerful technique for decomposing smart contract processing.&lt;/li&gt;
&lt;li&gt;I will reuse the &lt;code&gt;Loan&lt;/code&gt; contract again in a
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/03/13/writing-an-erc20-pawnshop-contract/&#34;&gt;later post&lt;/a&gt;.
In that post, the decomposition will make the solution &lt;em&gt;less&lt;/em&gt; complicated overall.  I just wanted to introduce the concept when solving a simpler problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;making-the-request&#34;&gt;Making the Request&lt;/h2&gt;

&lt;p&gt;To handle the creation of a loan, a borrower will deploy a smart contract that can create a loan between the borrower and a lender. This &lt;code&gt;LoanRequest&lt;/code&gt; contract is parameterized with the following values, which represent the terms of the loan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ERC20 &lt;strong&gt;token&lt;/strong&gt; that the lender accepts as collateral.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;collateral amount&lt;/strong&gt;, which is the unit amount of the token collateral.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;loan amount&lt;/strong&gt;, which is the amount of wei the borrower is borrowing.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;payoff amount&lt;/strong&gt;, which is the amount of wei that the borrower must pay to reclaim its tokens.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;loan duration&lt;/strong&gt; is the amount of time the borrower has pay off its loan after receiving the loan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping track of these in the smart contract is straightforward:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I&amp;rsquo;ve referenced an &lt;code&gt;IERC20Token&lt;/code&gt; interface for working with the token.  This was discussed in
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/&#34;&gt;token sale post&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;accepting-the-request&#34;&gt;Accepting the Request&lt;/h2&gt;

&lt;p&gt;If someone is willing to lend ether given the terms of the &lt;code&gt;LoanRequest&lt;/code&gt; contract, they can call &lt;code&gt;lendEther&lt;/code&gt;. This function transfers the ether to the borrower and transfers the collateral tokens to a new &lt;code&gt;Loan&lt;/code&gt; contract, which will enforce the terms of the loan. Below, I will show the implementation of the &lt;code&gt;Loan&lt;/code&gt; contract, but for now I will just assume it exists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequestAccepted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lendEther&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequestAccepted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;loan = new Loan(...)&lt;/code&gt; deploys a new &lt;code&gt;Loan&lt;/code&gt; contract to enforce the terms of the loan.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;token.transferFrom(...)&lt;/code&gt; transfers the token collateral from the borrower to the loan contract.&lt;/li&gt;
&lt;li&gt;The loaned ether is sent to the borrower.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;emit LoanRequestAccepted(loan)&lt;/code&gt; logs the transaction, which can alert the borrower that his request was fulfilled and let them know the address of the loan contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the conclusion of this function, the borrower holds the loaned ether, and the &lt;code&gt;Loan&lt;/code&gt; contract holds the collateral tokens. Both parties can easily find the &lt;code&gt;Loan&lt;/code&gt; contract thanks to the public &lt;code&gt;loan&lt;/code&gt; state variable.&lt;/p&gt;

&lt;p&gt;The code above is deceptively simple, and it hides a few very important details, which must be noted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;What if the borrower failed to approve the token transfer?&lt;/em&gt;  If the transfer wasn&amp;rsquo;t approved, then the &lt;code&gt;transferFrom&lt;/code&gt; will fail, and the whole transaction will be aborted, which means the borrower will not lose their ether.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;If the transaction fails, and the borrower doesn&amp;rsquo;t get ether, what happens to its tokens?&lt;/em&gt;  Nothing happens to them.  The borrower only &lt;em&gt;approved&lt;/em&gt; a transfer, and the transfer didn&amp;rsquo;t happen.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What happens if a lender never arrives and the borrower no longer wants to get the loan?&lt;/em&gt;  The borrower is free to cancel the token transfer approval at any time before a lender arrives.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;enforcing-the-loan-terms&#34;&gt;Enforcing the Loan Terms&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Loan&lt;/code&gt; contract enforces the terms of the loan. Its constructor just stores the parameters of the loan:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;Loan&lt;/code&gt; contract allows the borrower to reclaim its tokens by paying off the loan during the loan period. Should the borrower fail to pay off the loan before the due date, it allows the lender to repossess the forfeited tokens:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanPaid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payLoan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanPaid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;repossess&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Both routines above use &lt;code&gt;selfdestruct&lt;/code&gt; to terminate the contract, which has beneficial gas consequences and transfers any ether to the lender.  The &lt;code&gt;LoanPaid&lt;/code&gt; event is there to signal the lender that their ether is available.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A smart contract can exploit the ERC20 standard to facilitate using tokens as loan collateral.&lt;/li&gt;
&lt;li&gt;A smart contract can itself deploy smart contracts, which is a powerful technique for decomposing a problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contracts&#34;&gt;The Complete Contracts&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;loan.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IExvYW4gewogICAgYWRkcmVzcyBwdWJsaWMgbGVuZGVyOwogICAgYWRkcmVzcyBwdWJsaWMgYm9ycm93ZXI7CiAgICBJRVJDMjBUb2tlbiBwdWJsaWMgdG9rZW47CiAgICB1aW50MjU2IHB1YmxpYyBjb2xsYXRlcmFsQW1vdW50OwogICAgdWludDI1NiBwdWJsaWMgcGF5b2ZmQW1vdW50OwogICAgdWludDI1NiBwdWJsaWMgZHVlRGF0ZTsKCiAgICBmdW5jdGlvbiBMb2FuKAogICAgICAgIGFkZHJlc3MgX2xlbmRlciwKICAgICAgICBhZGRyZXNzIF9ib3Jyb3dlciwKICAgICAgICBJRVJDMjBUb2tlbiBfdG9rZW4sCiAgICAgICAgdWludDI1NiBfY29sbGF0ZXJhbEFtb3VudCwKICAgICAgICB1aW50MjU2IF9wYXlvZmZBbW91bnQsCiAgICAgICAgdWludDI1NiBsb2FuRHVyYXRpb24KICAgICkKICAgICAgICBwdWJsaWMKICAgIHsKICAgICAgICBsZW5kZXIgPSBfbGVuZGVyOwogICAgICAgIGJvcnJvd2VyID0gX2JvcnJvd2VyOwogICAgICAgIHRva2VuID0gX3Rva2VuOwogICAgICAgIGNvbGxhdGVyYWxBbW91bnQgPSBfY29sbGF0ZXJhbEFtb3VudDsKICAgICAgICBwYXlvZmZBbW91bnQgPSBfcGF5b2ZmQW1vdW50OwogICAgICAgIGR1ZURhdGUgPSBub3cgKyBsb2FuRHVyYXRpb247CiAgICB9CgogICAgZXZlbnQgTG9hblBhaWQoKTsKCiAgICBmdW5jdGlvbiBwYXlMb2FuKCkgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUobm93IDw9IGR1ZURhdGUpOwogICAgICAgIHJlcXVpcmUobXNnLnZhbHVlID09IHBheW9mZkFtb3VudCk7CgogICAgICAgIHJlcXVpcmUodG9rZW4udHJhbnNmZXIoYm9ycm93ZXIsIGNvbGxhdGVyYWxBbW91bnQpKTsKICAgICAgICBlbWl0IExvYW5QYWlkKCk7CiAgICAgICAgc2VsZmRlc3RydWN0KGxlbmRlcik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVwb3NzZXNzKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG5vdyA&amp;#43;IGR1ZURhdGUpOwoKICAgICAgICByZXF1aXJlKHRva2VuLnRyYW5zZmVyKGxlbmRlciwgY29sbGF0ZXJhbEFtb3VudCkpOwogICAgICAgIHNlbGZkZXN0cnVjdChsZW5kZXIpOwogICAgfQp9Cg==&#34; download=&#39;loan.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanPaid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payLoan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanPaid&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;repossess&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dueDate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;lender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;collateral.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKaW1wb3J0ICIuL2xvYW4uc29sIjsKCmNvbnRyYWN0IExvYW5SZXF1ZXN0IHsKICAgIGFkZHJlc3MgcHVibGljIGJvcnJvd2VyID0gbXNnLnNlbmRlcjsKICAgIElFUkMyMFRva2VuIHB1YmxpYyB0b2tlbjsKICAgIHVpbnQyNTYgcHVibGljIGNvbGxhdGVyYWxBbW91bnQ7CiAgICB1aW50MjU2IHB1YmxpYyBsb2FuQW1vdW50OwogICAgdWludDI1NiBwdWJsaWMgcGF5b2ZmQW1vdW50OwogICAgdWludDI1NiBwdWJsaWMgbG9hbkR1cmF0aW9uOwoKICAgIGZ1bmN0aW9uIExvYW5SZXF1ZXN0KAogICAgICAgIElFUkMyMFRva2VuIF90b2tlbiwKICAgICAgICB1aW50MjU2IF9jb2xsYXRlcmFsQW1vdW50LAogICAgICAgIHVpbnQyNTYgX2xvYW5BbW91bnQsCiAgICAgICAgdWludDI1NiBfcGF5b2ZmQW1vdW50LAogICAgICAgIHVpbnQyNTYgX2xvYW5EdXJhdGlvbgogICAgKQogICAgICAgIHB1YmxpYwogICAgewogICAgICAgIHRva2VuID0gX3Rva2VuOwogICAgICAgIGNvbGxhdGVyYWxBbW91bnQgPSBfY29sbGF0ZXJhbEFtb3VudDsKICAgICAgICBsb2FuQW1vdW50ID0gX2xvYW5BbW91bnQ7CiAgICAgICAgcGF5b2ZmQW1vdW50ID0gX3BheW9mZkFtb3VudDsKICAgICAgICBsb2FuRHVyYXRpb24gPSBfbG9hbkR1cmF0aW9uOwogICAgfQoKICAgIExvYW4gcHVibGljIGxvYW47CgogICAgZXZlbnQgTG9hblJlcXVlc3RBY2NlcHRlZChhZGRyZXNzIGxvYW4pOwoKICAgIGZ1bmN0aW9uIGxlbmRFdGhlcigpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICByZXF1aXJlKG1zZy52YWx1ZSA9PSBsb2FuQW1vdW50KTsKICAgICAgICBsb2FuID0gbmV3IExvYW4oCiAgICAgICAgICAgIG1zZy5zZW5kZXIsCiAgICAgICAgICAgIGJvcnJvd2VyLAogICAgICAgICAgICB0b2tlbiwKICAgICAgICAgICAgY29sbGF0ZXJhbEFtb3VudCwKICAgICAgICAgICAgcGF5b2ZmQW1vdW50LAogICAgICAgICAgICBsb2FuRHVyYXRpb24KICAgICAgICApOwogICAgICAgIHJlcXVpcmUodG9rZW4udHJhbnNmZXJGcm9tKGJvcnJvd2VyLCBsb2FuLCBjb2xsYXRlcmFsQW1vdW50KSk7CiAgICAgICAgYm9ycm93ZXIudHJhbnNmZXIobG9hbkFtb3VudCk7CiAgICAgICAgZW1pdCBMb2FuUmVxdWVzdEFjY2VwdGVkKGxvYW4pOwogICAgfQp9Cg==&#34; download=&#39;collateral.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./loan.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequest&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_loanDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequestAccepted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;lendEther&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
            &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;payoffAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;loanDuration&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;collateralAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;borrower&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loanAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LoanRequestAccepted&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;loan&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Building Long-Lived Payment Channels</title>
      <link>https://programtheblockchain.com/posts/2018/03/02/building-long-lived-payment-channels/</link>
      <pubDate>Fri, 02 Mar 2018 04:56:33 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/03/02/building-long-lived-payment-channels/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-12-10&lt;/strong&gt;] &lt;em&gt;Since publishing this post, We&amp;rsquo;ve added a related
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/12/10/introduction-to-ethereum-payment-channels-video/&#34;&gt;video explanation of payment channels&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;Writing a Simple Payment Channel&lt;/a&gt;, I introduced &lt;em&gt;payment channels&lt;/em&gt; as a way to reduce the number of Ethereum transactions required for repeated payments between the same two parties. This post will improve upon that post&amp;rsquo;s &lt;code&gt;SimplePaymentChannel&lt;/code&gt; contract to make it suitable for long-lived payment channels, such as might be used to pay an employee an hourly wage over the course of their career.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;SimplePaymentChannel&lt;/code&gt; from &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;Writing a Simple Payment Channel&lt;/a&gt; works well for payments made over a short period of time, but it has three limitations in the context of long-lived channels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The sender must escrow all ether up front.&lt;/li&gt;
&lt;li&gt;The recipient can make only a single withdrawal.&lt;/li&gt;
&lt;li&gt;The timing of the channel closure is fixed when the channel is created.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;rsquo;ll make three changes to the &lt;code&gt;SimplePaymentChannel&lt;/code&gt; contract to address these shortcomings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Allow the sender to escrow a minimal amount of ether up front and add more funds as needed.&lt;/li&gt;
&lt;li&gt;Allow the recipient to withdraw ether as needed before closing the channel.&lt;/li&gt;
&lt;li&gt;Allow the sender to initiate channel closure so they can recover unspent funds in a reasonable timeframe.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;minimizing-the-escrowed-funds&#34;&gt;Minimizing the Escrowed Funds&lt;/h2&gt;

&lt;p&gt;Payment channels hold escrowed funds to guarantee that a valid, signed payment message will be honored. Recipients will accept a message saying &amp;ldquo;I owe you a total of &lt;em&gt;n&lt;/em&gt; ether,&amp;rdquo; if and only if the channel contract has escrowed &lt;em&gt;n&lt;/em&gt; ether.&lt;/p&gt;

&lt;p&gt;Because it&amp;rsquo;s trivial to check the channel&amp;rsquo;s current balance, it&amp;rsquo;s reasonable to allow multiple deposits to the channel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With this addition, the sender no longer needs to escrow all funds up front. However, each deposit requires an Ethereum transaction&amp;mdash;and thus a transaction fee&amp;mdash;so the sender must make a tradeoff between smaller, more frequent deposits and larger, less frequent ones.&lt;/p&gt;

&lt;h2 id=&#34;allowing-early-withdrawals&#34;&gt;Allowing Early Withdrawals&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;SimplePaymentChannel&lt;/code&gt;, the recipient can only make a single withdrawal, which closes the channel. A little bookkeeping enables multiple withdrawals without closing the channel.  Recall that a withdrawal is done by presenting a signed IOU from the sender to the channel contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// How much the recipient has already withdrawn.&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Make sure there&amp;#39;s something to withdraw (guards against underflow)&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountToWithdraw&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountToWithdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amountToWithdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;withdrawn&lt;/code&gt; state variable tracks how much ether the recipient has already withdrawn.&lt;/li&gt;
&lt;li&gt;The recipient withdraws the total amount that&amp;rsquo;s been authorized so far minus the amount already withdrawn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, I need to make a small change to the &lt;code&gt;close&lt;/code&gt; function to take into account the amount already withdrawn:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Guard against underflow.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As in the previous section, this new ability introduces a tradeoff. The recipient can now access funds early by using the &lt;code&gt;withdraw&lt;/code&gt; function, but each withdrawal requires an Ethereum transaction.&lt;/p&gt;

&lt;h2 id=&#34;allowing-the-sender-to-close-the-channel&#34;&gt;Allowing the Sender to Close the Channel&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;SimplePaymentChannel&lt;/code&gt; introduced in &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/&#34;&gt;Writing a Simple Payment Channel&lt;/a&gt; has an expiration time built in, and only the recipient can close the channel earlier than that. This is a problem for long-lived payment channels because it means the sender has no way to recover escrowed, unspent funds without the recipient&amp;rsquo;s cooperation.&lt;/p&gt;

&lt;p&gt;To support long-lived payment channels, I&amp;rsquo;ll allow the sender to initiate channel closure. The recipient will then have some time to claim any funds they&amp;rsquo;re owed, after which the sender can access whatever&amp;rsquo;s left. With this new mechanism, there&amp;rsquo;s no need to have a fixed expiration at all.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// How much time the recipient has to respond when the sender initiates&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// channel closure.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// When the payment channel closes. Initially effectively infinite.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LongLivedPaymentChannel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;closeDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The preceding code sets up the state variables that are used for sender-initiated channel closure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;closeDuration&lt;/code&gt; specifies, in seconds, how long the recipient will have to claim their funds after the sender initiates a close. It is set in the contract&amp;rsquo;s constructor.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;expiration&lt;/code&gt; is when the sender is allowed to close the channel. Initially, there&amp;rsquo;s effectively no expiration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To initiate channel closure, the sender calls &lt;code&gt;startSenderClose&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartSenderClose&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startSenderClose&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartSenderClose&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;expiration&lt;/code&gt; is set to &lt;code&gt;closeDuration&lt;/code&gt; seconds in the future.&lt;/li&gt;
&lt;li&gt;The recipient can watch for the &lt;code&gt;StartSenderClose&lt;/code&gt; event so they know when it&amp;rsquo;s time to collect what they&amp;rsquo;re owed by closing the channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the timeout is reached before the recipient closes the channel, the sender can close it and claim all remaining funds:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If the timeout is reached without the recipient closing the channel, then&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the ether is released back to the sender.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For long-lived payment channels, it&amp;rsquo;s desirable to maximize availability of funds for both the sender and the recipient.&lt;/li&gt;
&lt;li&gt;At any given time, the sender only needs to have enough funds escrowed to cover the amount already committed to the recipient.&lt;/li&gt;
&lt;li&gt;At any given time, the recipient can withdraw up to the amount they&amp;rsquo;re owed.&lt;/li&gt;
&lt;li&gt;Sender-initiated channel closure ensures that the sender can recover unpaid funds in a reasonable timeframe.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;longLivedPaymentChannel.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBMb25nTGl2ZWRQYXltZW50Q2hhbm5lbCB7CiAgICBhZGRyZXNzIHB1YmxpYyBzZW5kZXI7ICAgICAgLy8gVGhlIGFjY291bnQgc2VuZGluZyBwYXltZW50cy4KICAgIGFkZHJlc3MgcHVibGljIHJlY2lwaWVudDsgICAvLyBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHBheW1lbnRzLgogICAgdWludDI1NiBwdWJsaWMgd2l0aGRyYXduOyAgIC8vIEhvdyBtdWNoIHRoZSByZWNpcGllbnQgaGFzIGFscmVhZHkgd2l0aGRyYXduLgoKICAgIC8vIEhvdyBtdWNoIHRpbWUgdGhlIHJlY2lwaWVudCBoYXMgdG8gcmVzcG9uZCB3aGVuIHRoZSBzZW5kZXIgaW5pdGlhdGVzCiAgICAvLyBjaGFubmVsIGNsb3N1cmUuCiAgICB1aW50MjU2IHB1YmxpYyBjbG9zZUR1cmF0aW9uOwogICAgLy8gV2hlbiB0aGUgcGF5bWVudCBjaGFubmVsIGNsb3Nlcy4gSW5pdGlhbGx5IGVmZmVjdGl2ZWx5IGluZmluaXRlLgogICAgdWludDI1NiBwdWJsaWMgZXhwaXJhdGlvbiA9IDIqKjI1Ni0xOwoKICAgIGZ1bmN0aW9uIExvbmdMaXZlZFBheW1lbnRDaGFubmVsKGFkZHJlc3MgX3JlY2lwaWVudCwgdWludDI1NiBfY2xvc2VEdXJhdGlvbikKICAgICAgICBwdWJsaWMKICAgICAgICBwYXlhYmxlCiAgICB7CiAgICAgICAgc2VuZGVyID0gbXNnLnNlbmRlcjsKICAgICAgICByZWNpcGllbnQgPSBfcmVjaXBpZW50OwogICAgICAgIGNsb3NlRHVyYXRpb24gPSBfY2xvc2VEdXJhdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBpc1ZhbGlkU2lnbmF0dXJlKHVpbnQyNTYgYW1vdW50LCBieXRlcyBzaWduYXR1cmUpCiAgICAgICAgaW50ZXJuYWwKICAgICAgICB2aWV3CiAgICAgICAgcmV0dXJucyAoYm9vbCkKICAgIHsKICAgICAgICBieXRlczMyIG1lc3NhZ2UgPSBwcmVmaXhlZChrZWNjYWsyNTYodGhpcywgYW1vdW50KSk7CgogICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBmcm9tIHRoZSBwYXltZW50IHNlbmRlci4KICAgICAgICByZXR1cm4gcmVjb3ZlclNpZ25lcihtZXNzYWdlLCBzaWduYXR1cmUpID09IHNlbmRlcjsKICAgIH0KCiAgICAvLyBUaGUgcmVjaXBpZW50IGNhbiBjbG9zZSB0aGUgY2hhbm5lbCBhdCBhbnkgdGltZSBieSBwcmVzZW50aW5nIGEgc2lnbmVkCiAgICAvLyBhbW91bnQgZnJvbSB0aGUgc2VuZGVyLiBUaGUgcmVjaXBpZW50IHdpbGwgYmUgc2VudCB0aGF0IGFtb3VudCwgYW5kIHRoZQogICAgLy8gcmVtYWluZGVyIHdpbGwgZ28gYmFjayB0byB0aGUgc2VuZGVyLgogICAgZnVuY3Rpb24gY2xvc2UodWludDI1NiBhbW91bnQsIGJ5dGVzIHNpZ25hdHVyZSkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gcmVjaXBpZW50KTsKICAgICAgICByZXF1aXJlKGlzVmFsaWRTaWduYXR1cmUoYW1vdW50LCBzaWduYXR1cmUpKTsKCiAgICAgICAgcmVxdWlyZShhbW91bnQgPj0gd2l0aGRyYXduKTsKICAgICAgICByZWNpcGllbnQudHJhbnNmZXIoYW1vdW50IC0gd2l0aGRyYXduKTsKCiAgICAgICAgc2VsZmRlc3RydWN0KHNlbmRlcik7CiAgICB9CgogICAgZXZlbnQgU3RhcnRTZW5kZXJDbG9zZSgpOwoKICAgIGZ1bmN0aW9uIHN0YXJ0U2VuZGVyQ2xvc2UoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobXNnLnNlbmRlciA9PSBzZW5kZXIpOwogICAgICAgIGVtaXQgU3RhcnRTZW5kZXJDbG9zZSgpOwogICAgICAgIGV4cGlyYXRpb24gPSBub3cgKyBjbG9zZUR1cmF0aW9uOwogICAgfQoKICAgIC8vIElmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQgd2l0aG91dCB0aGUgcmVjaXBpZW50IGNsb3NpbmcgdGhlIGNoYW5uZWwsIHRoZW4KICAgIC8vIHRoZSBldGhlciBpcyByZWxlYXNlZCBiYWNrIHRvIHRoZSBzZW5kZXIuCiAgICBmdW5jdGlvbiBjbGFpbVRpbWVvdXQoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGV4cGlyYXRpb24pOwogICAgICAgIHNlbGZkZXN0cnVjdChzZW5kZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlcG9zaXQoKSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHNlbmRlcik7CiAgICB9CgogICAgZnVuY3Rpb24gd2l0aGRyYXcodWludDI1NiBhbW91bnRBdXRob3JpemVkLCBieXRlcyBzaWduYXR1cmUpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHJlY2lwaWVudCk7CgogICAgICAgIHJlcXVpcmUoaXNWYWxpZFNpZ25hdHVyZShhbW91bnRBdXRob3JpemVkLCBzaWduYXR1cmUpKTsKCiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIHdpdGhkcmF3IChndWFyZHMgYWdhaW5zdCB1bmRlcmZsb3cpCiAgICAgICAgcmVxdWlyZShhbW91bnRBdXRob3JpemVkID4gd2l0aGRyYXduKTsKICAgICAgICB1aW50MjU2IGFtb3VudFRvV2l0aGRyYXcgPSBhbW91bnRBdXRob3JpemVkIC0gd2l0aGRyYXduOwoKICAgICAgICB3aXRoZHJhd24gKz0gYW1vdW50VG9XaXRoZHJhdzsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudFRvV2l0aGRyYXcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwbGl0U2lnbmF0dXJlKGJ5dGVzIHNpZykKICAgICAgICBpbnRlcm5hbAogICAgICAgIHB1cmUKICAgICAgICByZXR1cm5zICh1aW50OCwgYnl0ZXMzMiwgYnl0ZXMzMikKICAgIHsKICAgICAgICByZXF1aXJlKHNpZy5sZW5ndGggPT0gNjUpOwoKICAgICAgICBieXRlczMyIHI7CiAgICAgICAgYnl0ZXMzMiBzOwogICAgICAgIHVpbnQ4IHY7CgogICAgICAgIGFzc2VtYmx5IHsKICAgICAgICAgICAgLy8gZmlyc3QgMzIgYnl0ZXMsIGFmdGVyIHRoZSBsZW5ndGggcHJlZml4CiAgICAgICAgICAgIHIgOj0gbWxvYWQoYWRkKHNpZywgMzIpKQogICAgICAgICAgICAvLyBzZWNvbmQgMzIgYnl0ZXMKICAgICAgICAgICAgcyA6PSBtbG9hZChhZGQoc2lnLCA2NCkpCiAgICAgICAgICAgIC8vIGZpbmFsIGJ5dGUgKGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgMzIgYnl0ZXMpCiAgICAgICAgICAgIHYgOj0gYnl0ZSgwLCBtbG9hZChhZGQoc2lnLCA5NikpKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICh2LCByLCBzKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWNvdmVyU2lnbmVyKGJ5dGVzMzIgbWVzc2FnZSwgYnl0ZXMgc2lnKQogICAgICAgIGludGVybmFsCiAgICAgICAgcHVyZQogICAgICAgIHJldHVybnMgKGFkZHJlc3MpCiAgICB7CiAgICAgICAgdWludDggdjsKICAgICAgICBieXRlczMyIHI7CiAgICAgICAgYnl0ZXMzMiBzOwoKICAgICAgICAodiwgciwgcykgPSBzcGxpdFNpZ25hdHVyZShzaWcpOwoKICAgICAgICByZXR1cm4gZWNyZWNvdmVyKG1lc3NhZ2UsIHYsIHIsIHMpOwogICAgfQoKICAgIC8vIEJ1aWxkcyBhIHByZWZpeGVkIGhhc2ggdG8gbWltaWMgdGhlIGJlaGF2aW9yIG9mIGV0aF9zaWduLgogICAgZnVuY3Rpb24gcHJlZml4ZWQoYnl0ZXMzMiBoYXNoKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKGJ5dGVzMzIpIHsKICAgICAgICByZXR1cm4ga2VjY2FrMjU2KCJceDE5RXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6XG4zMiIsIGhhc2gpOwogICAgfQp9Cg==&#34; download=&#39;longLivedPaymentChannel.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LongLivedPaymentChannel&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;      &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The account sending payments.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The account receiving the payments.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// How much the recipient has already withdrawn.&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// How much time the recipient has to respond when the sender initiates&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// channel closure.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// When the payment channel closes. Initially effectively infinite.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;LongLivedPaymentChannel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;closeDuration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Check that the signature is from the payment sender.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The recipient can close the channel at any time by presenting a signed&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// amount from the sender. The recipient will be sent that amount, and the&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// remainder will go back to the sender.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartSenderClose&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;startSenderClose&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;StartSenderClose&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;closeDuration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If the timeout is reached without the recipient closing the channel, then&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the ether is released back to the sender.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Make sure there&amp;#39;s something to withdraw (guards against underflow)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountToWithdraw&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountAuthorized&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;withdrawn&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amountToWithdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amountToWithdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Token Market Contract</title>
      <link>https://programtheblockchain.com/posts/2018/02/27/writing-a-token-market-contract/</link>
      <pubDate>Tue, 27 Feb 2018 06:13:43 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/27/writing-a-token-market-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post will demonstrate how to write a smart contract that creates a token marketplace, where people can buy and sell ERC20 tokens.  The smart contract acts like
&lt;a href=&#34;https://www.ebay.com&#34;&gt;eBay&lt;/a&gt;
by enabling sellers to list tokens for sale, and then brokering sales to buyers.  This post relies on concepts introduced in our post on
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;ERC20 tokens&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;ERC20 token owners may want to sell some of their tokens.  Of course, it would be natural to sell the tokens for ether and to conduct that sale via a smart contract.  To help buyers find sellers, a single marketplace contract allows sellers to list tokens for sale&amp;mdash;in a given quantity and for a given price&amp;mdash;and then brokers sales when approached by buyers.&lt;/p&gt;

&lt;p&gt;My marketplace contract will support three essential transactions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sellers can &lt;strong&gt;list&lt;/strong&gt; a token for sale.  The listing will include the quantity available and the price/unit.&lt;/li&gt;
&lt;li&gt;Buyers can &lt;strong&gt;buy&lt;/strong&gt; a token advertised in a given listing.  The purchase quantity can be any amount up to the total available in the listing, and the price will be computed based on the listing&amp;rsquo;s price/unit.&lt;/li&gt;
&lt;li&gt;Sellers can &lt;strong&gt;cancel&lt;/strong&gt; an existing listing.  Cancellation doesn&amp;rsquo;t affect any previously made sales, but it will prevent any subsequent sales.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;more-floating-point-woes&#34;&gt;(More) Floating Point Woes&lt;/h2&gt;

&lt;p&gt;Solidity&amp;rsquo;s lack of support for floating point numbers presents challenges when pricing tokens.  It&amp;rsquo;s natural to give prices in wei per token unit, but sometimes integer values are insufficient.  For instance, it is impossible to express 1.5 wei/unit or 0.0001 wei/unit with a simple integer value.&lt;/p&gt;

&lt;p&gt;In this contract, I&amp;rsquo;m going to use a very simple technique&amp;mdash;the contract will use a rational number expressed as &lt;sup&gt;&lt;em&gt;numerator&lt;/em&gt;&lt;/sup&gt;/&lt;sub&gt;&lt;em&gt;denominator&lt;/em&gt;&lt;/sub&gt;, where both numerator and denominator are 256-bit unsigned integers.  This will give plenty of precision to express any reasonable price.&lt;/p&gt;

&lt;h2 id=&#34;solidity-struct-s&#34;&gt;Solidity &lt;code&gt;struct&lt;/code&gt;s&lt;/h2&gt;

&lt;p&gt;Each listing is composed of five related values: the seller&amp;rsquo;s address, the token&amp;rsquo;s address, the quantity available (in units), and the wei/unit price given as a rational number.&lt;/p&gt;

&lt;p&gt;Solidity supports a &lt;code&gt;struct&lt;/code&gt; datatype for grouping data together:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// wei/unit price as a rational number&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;priceNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;priceDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Solidity&amp;rsquo;s structs are very similar to C&amp;rsquo;s and Go&amp;rsquo;s as a means for treating related data as a unit.&lt;/p&gt;

&lt;h2 id=&#34;solidity-arrays&#34;&gt;Solidity Arrays&lt;/h2&gt;

&lt;p&gt;The marketplace contract must keep track of all the sellers&amp;rsquo; listings, and it will do so in a dynamically-sized array.  Solidity arrays are indexed from 0:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once a listing is added to the array, it will be referenced by its location (index) in the &lt;code&gt;listings&lt;/code&gt; array.  Future purchase and cancellation transactions will refer to the listing&amp;rsquo;s index.&lt;/p&gt;

&lt;h2 id=&#34;listing-tokens-for-sale&#34;&gt;Listing Tokens for Sale&lt;/h2&gt;

&lt;p&gt;Adding a listing to the marketplace contract is very straightforward:  the contract will create a new &lt;code&gt;listing&lt;/code&gt; struct with the appropriate values and append it to the end of the &lt;code&gt;listings&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;In addition to storing the listing, the contract will log an event to announce the listing change to the outside world.  The event will include the seller&amp;rsquo;s address and the listing&amp;rsquo;s index.  The seller&amp;rsquo;s address is indexed to help the seller determine the indices of its listing(s).&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;list&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;memory&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;priceNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;priceDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above introduces three new Solidity features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Listing memory x&lt;/code&gt; declares a &lt;code&gt;Listing&lt;/code&gt; struct that will reside in &lt;em&gt;memory&lt;/em&gt;, which is temporary, rather than having it reside in persistent storage.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Listing(...)&lt;/code&gt; creates a new &lt;code&gt;Listing&lt;/code&gt; struct with named fields set to the argument values.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;listings.push(x)&lt;/code&gt; adds an element to the end of the &lt;code&gt;listing&lt;/code&gt; array.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This contract will use the ERC20 token &lt;code&gt;approve&lt;/code&gt;/&lt;code&gt;transferFrom&lt;/code&gt; pattern for delegating token transfers.  So, the buyer must &lt;code&gt;approve&lt;/code&gt; the marketplace contract to transfer the listed tokens prior to any buyers attempting to buy those tokens.  The marketplace contract never checks that the appropriate &lt;code&gt;approve&lt;/code&gt; has happened&amp;mdash;it simply assumes it has.&lt;/p&gt;

&lt;h2 id=&#34;buying-tokens&#34;&gt;Buying Tokens&lt;/h2&gt;

&lt;p&gt;Making a purchase is also straightforward:  the buyer indicates the index of the listing to be used, and the quantity to purchase.  The buyer must also attach the appropriate amount of ether to the transaction:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cost&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;priceNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;priceDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cost&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;cost&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The code checks that the tokens requested are available, updates the amount available, and transfers the tokens to the buyer.&lt;/li&gt;
&lt;li&gt;The code computes the total cost of the transaction, checks that the buyer attached that amount of ether, and transfers the ether to the seller.&lt;/li&gt;
&lt;li&gt;The code logs an event, which can alert the seller or a DApp to the purchase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The statement, &lt;code&gt;Listing storage listing = listings[index]&lt;/code&gt;,  exploits the fact that &lt;code&gt;storage&lt;/code&gt; variables are &lt;em&gt;references&lt;/em&gt; to persistent storage.  This means that any changes to the fields of &lt;code&gt;listing&lt;/code&gt; will actually be to the underlying &lt;code&gt;listings[index]&lt;/code&gt; struct.&lt;/p&gt;

&lt;p&gt;Note that while the marketplace contract never explicitly checked that the seller had approved the transfer, the &lt;code&gt;buy&lt;/code&gt; transaction will fail if the &lt;code&gt;transferFrom&lt;/code&gt; does not succeed.&lt;/p&gt;

&lt;h2 id=&#34;cancelling-a-listing&#34;&gt;Cancelling a Listing&lt;/h2&gt;

&lt;p&gt;A seller may cancel a listing at any time.  Cancellation will simply delete&amp;mdash;zero out&amp;mdash;the fields of the &lt;code&gt;listing&lt;/code&gt; struct.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The ERC20 token standard enables a marketplace contract to broker sales of many different tokens on behalf of many different sellers.&lt;/li&gt;
&lt;li&gt;Solidity supports structs for grouping related values.&lt;/li&gt;
&lt;li&gt;Solidity supports dynamically-sized arrays for 0-indexed lists of values.&lt;/li&gt;
&lt;li&gt;To compensate for the Ethereum Virtual Machine&amp;rsquo;s lack of support for floating point numbers, a contract can use rational numbers with explicit numerators and denominators.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contracts&#34;&gt;The Complete Contracts&lt;/h2&gt;

&lt;p&gt;The complete code for the &lt;code&gt;TokenMarket&lt;/code&gt; contract is below.  I&amp;rsquo;ve used Solidity&amp;rsquo;s &lt;code&gt;import&lt;/code&gt; directive to indicate that the code for &lt;code&gt;IERC20Token&lt;/code&gt; interface will be loaded from a separate file.&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;ierc20token.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbnRlcmZhY2UgSUVSQzIwVG9rZW4gewogICAgZnVuY3Rpb24gdG90YWxTdXBwbHkoKSBleHRlcm5hbCBjb25zdGFudCByZXR1cm5zICh1aW50KTsKICAgIGZ1bmN0aW9uIGJhbGFuY2VPZihhZGRyZXNzIHRva2VubGVuZGVyKSBleHRlcm5hbCBjb25zdGFudCByZXR1cm5zICh1aW50IGJhbGFuY2UpOwogICAgZnVuY3Rpb24gYWxsb3dhbmNlKGFkZHJlc3MgdG9rZW5sZW5kZXIsIGFkZHJlc3Mgc3BlbmRlcikgZXh0ZXJuYWwgY29uc3RhbnQgcmV0dXJucyAodWludCByZW1haW5pbmcpOwogICAgZnVuY3Rpb24gdHJhbnNmZXIoYWRkcmVzcyB0bywgdWludCB0b2tlbnMpIGV4dGVybmFsIHJldHVybnMgKGJvb2wgc3VjY2Vzcyk7CiAgICBmdW5jdGlvbiBhcHByb3ZlKGFkZHJlc3Mgc3BlbmRlciwgdWludCB0b2tlbnMpIGV4dGVybmFsIHJldHVybnMgKGJvb2wgc3VjY2Vzcyk7CiAgICBmdW5jdGlvbiB0cmFuc2ZlckZyb20oYWRkcmVzcyBmcm9tLCBhZGRyZXNzIHRvLCB1aW50IHRva2VucykgZXh0ZXJuYWwgcmV0dXJucyAoYm9vbCBzdWNjZXNzKTsKCiAgICBldmVudCBUcmFuc2ZlcihhZGRyZXNzIGluZGV4ZWQgZnJvbSwgYWRkcmVzcyBpbmRleGVkIHRvLCB1aW50IHRva2Vucyk7CiAgICBldmVudCBBcHByb3ZhbChhZGRyZXNzIGluZGV4ZWQgdG9rZW5sZW5kZXIsIGFkZHJlc3MgaW5kZXhlZCBzcGVuZGVyLCB1aW50IHRva2Vucyk7Cn0K&#34; download=&#39;ierc20token.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;constant&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenlender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;constant&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenlender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;constant&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remaining&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenlender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;tokenmarket.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbXBvcnQgIi4vaWVyYzIwdG9rZW4uc29sIjsKCmNvbnRyYWN0IFRva2VuTWFya2V0IHsKICAgIHN0cnVjdCBMaXN0aW5nIHsKICAgICAgICBhZGRyZXNzIHNlbGxlcjsKICAgICAgICBJRVJDMjBUb2tlbiB0b2tlbjsKICAgICAgICB1aW50MjU2IHVuaXRzQXZhaWxhYmxlOwoKICAgICAgICAvLyB3ZWkvdW5pdCBwcmljZSBhcyBhIHJhdGlvbmFsIG51bWJlcgogICAgICAgIHVpbnQyNTYgcHJpY2VOdW1lcmF0b3I7CiAgICAgICAgdWludDI1NiBwcmljZURlbm9taW5hdG9yOwogICAgfQoKICAgIExpc3RpbmdbXSBwdWJsaWMgbGlzdGluZ3M7CgogICAgZXZlbnQgTGlzdGluZ0NoYW5nZWQoYWRkcmVzcyBpbmRleGVkIHNlbGxlciwgdWludDI1NiBpbmRleGVkIGluZGV4KTsKCiAgICBmdW5jdGlvbiBsaXN0KAogICAgICAgIElFUkMyMFRva2VuIHRva2VuLAogICAgICAgIHVpbnQyNTYgdW5pdHMsCiAgICAgICAgdWludDI1NiBudW1lcmF0b3IsCiAgICAgICAgdWludDI1NiBkZW5vbWluYXRvcgogICAgKSBwdWJsaWMgewogICAgICAgIExpc3RpbmcgbWVtb3J5IGxpc3RpbmcgPSBMaXN0aW5nKHsKICAgICAgICAgICAgc2VsbGVyOiBtc2cuc2VuZGVyLAogICAgICAgICAgICB0b2tlbjogdG9rZW4sCiAgICAgICAgICAgIHVuaXRzQXZhaWxhYmxlOiB1bml0cywKICAgICAgICAgICAgcHJpY2VOdW1lcmF0b3I6IG51bWVyYXRvciwKICAgICAgICAgICAgcHJpY2VEZW5vbWluYXRvcjogZGVub21pbmF0b3IKICAgICAgICB9KTsKCiAgICAgICAgbGlzdGluZ3MucHVzaChsaXN0aW5nKTsKICAgICAgICBlbWl0IExpc3RpbmdDaGFuZ2VkKG1zZy5zZW5kZXIsIGxpc3RpbmdzLmxlbmd0aC0xKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWwodWludDI1NiBpbmRleCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKGxpc3RpbmdzW2luZGV4XS5zZWxsZXIgPT0gbXNnLnNlbmRlcik7CiAgICAgICAgZGVsZXRlKGxpc3RpbmdzW2luZGV4XSk7CiAgICAgICAgZW1pdCBMaXN0aW5nQ2hhbmdlZChtc2cuc2VuZGVyLCBpbmRleCk7CiAgICB9CgogICAgZnVuY3Rpb24gYnV5KHVpbnQyNTYgaW5kZXgsIHVpbnQyNTYgdW5pdHMpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICBMaXN0aW5nIHN0b3JhZ2UgbGlzdGluZyA9IGxpc3RpbmdzW2luZGV4XTsKCiAgICAgICAgcmVxdWlyZShsaXN0aW5nLnVuaXRzQXZhaWxhYmxlID49IHVuaXRzKTsKICAgICAgICBsaXN0aW5nLnVuaXRzQXZhaWxhYmxlIC09IHVuaXRzOwogICAgICAgIHJlcXVpcmUobGlzdGluZy50b2tlbi50cmFuc2ZlckZyb20obGlzdGluZy5zZWxsZXIsIG1zZy5zZW5kZXIsIHVuaXRzKSk7CgogICAgICAgIHVpbnQyNTYgY29zdCA9ICh1bml0cyAqIGxpc3RpbmcucHJpY2VOdW1lcmF0b3IpIC8KICAgICAgICAgICAgbGlzdGluZy5wcmljZURlbm9taW5hdG9yOwogICAgICAgIHJlcXVpcmUobXNnLnZhbHVlID09IGNvc3QpOwogICAgICAgIGxpc3Rpbmcuc2VsbGVyLnRyYW5zZmVyKGNvc3QpOwoKICAgICAgICBlbWl0IExpc3RpbmdDaGFuZ2VkKGxpc3Rpbmcuc2VsbGVyLCBpbmRleCk7CiAgICB9Cn0K&#34; download=&#39;tokenmarket.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #cb4b16&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;./ierc20token.sol&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenMarket&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// wei/unit price as a rational number&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;priceNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;priceDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;list&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;memory&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;({&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;priceNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;priceDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;denominator&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cancel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;delete&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buy&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;Listing&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;storage&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;unitsAvailable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cost&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;units&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;priceNumerator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;priceDenominator&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;cost&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;cost&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ListingChanged&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;listing&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;seller&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Simple Payment Channel</title>
      <link>https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/</link>
      <pubDate>Fri, 23 Feb 2018 10:28:42 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/23/writing-a-simple-payment-channel/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-12-10&lt;/strong&gt;] &lt;em&gt;Since publishing this post, We&amp;rsquo;ve added a related
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/12/10/introduction-to-ethereum-payment-channels-video/&#34;&gt;video explanation of payment channels&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this post, I&amp;rsquo;ll build a simple, but complete, implementation of a &lt;em&gt;payment channel&lt;/em&gt;. Payment channels use cryptographic signatures to make repeated transfers of ether securely, instantaneously, and without transaction fees. This post will rely heavily on the concepts and code from our post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;&amp;ldquo;Signing and Verifying Messages in Ethereum&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;what-is-a-payment-channel&#34;&gt;What is a Payment Channel?&lt;/h2&gt;

&lt;p&gt;Ethereum transactions provide a secure way to transfer funds, but each transaction needs to be included in a block and mined. This means transactions take some time and require payment to compensate the miners for their work. In particular, transaction fees make micropayments a difficult use case for Ethereum and other blockchains like it.&lt;/p&gt;

&lt;p&gt;Payment channels allow participants to make repeated transfers of ether &lt;em&gt;without&lt;/em&gt; using transactions. This means that the delays and fees associated with transactions can be avoided. In this post, we&amp;rsquo;re going to explore a simple unidirectional payment channel between two parties. Using it involves three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The sender funds a smart contract with ether. This &amp;ldquo;opens&amp;rdquo; the payment channel.&lt;/li&gt;
&lt;li&gt;The sender signs messages that specify how much of that ether is owed to the recipient. This step is repeated for each payment.&lt;/li&gt;
&lt;li&gt;The recipient &amp;ldquo;closes&amp;rdquo; the payment channel, withdrawing their portion of the ether and sending the remainder back to the sender.&lt;/li&gt;
&lt;/ol&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/images/payment%20channel.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/payment%20channel.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;p&gt;Importantly, only steps 1 and 3 require Ethereum transactions. Step 2 is accomplished off-chain through cryptographic signatures and some sort of communication between the two parties, such as email. This means only two transactions are required to support any number of transfers.&lt;/p&gt;

&lt;p&gt;The recipient is guaranteed to receive their funds because the smart contract escrows the ether and honors a valid signed message. The smart contract also enforces a timeout, so the sender is guaranteed to eventually recover their funds even if the recipient refuses to close the channel.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s up to the participants in a payment channel to decide how long to keep it open. For a short-lived interaction, such as paying an internet cafe for each minute of network access, it makes sense to use a payment channel that lasts only an hour or so. For a longer relationship, such as paying an employee an hourly wage, a payment channel could last for months or years. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h2 id=&#34;opening-the-payment-channel&#34;&gt;Opening the Payment Channel&lt;/h2&gt;

&lt;p&gt;To open the payment channel, the sender deploys the smart contract, attaching the ether to be escrowed and specifying the intended recipient and a maximum duration for the channel to exist.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimplePaymentChannel&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The account sending payments.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The account receiving the payments.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Timeout in case the recipient never closes.&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimplePaymentChannel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;duration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;duration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;making-payments&#34;&gt;Making Payments&lt;/h2&gt;

&lt;p&gt;The sender makes payments by sending messages to the recipient. This step is performed entirely outside of the Ethereum network. Messages are cryptographically signed by the sender and then transmitted directly to the recipient.&lt;/p&gt;

&lt;p&gt;Each message includes the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The smart contract&amp;rsquo;s address, used to prevent cross-contract replay attacks.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;total&lt;/strong&gt; amount of ether that is owed the recipient so far.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A payment channel is closed just once, at the end of a series of transfers. Because of this, only one of the messages sent will be redeemed. This is why each message specifies a cumulative total amount of ether owed, rather than the amount of the individual micropayment. The recipient will naturally choose to redeem the most recent message because that&amp;rsquo;s the one with the highest total.&lt;/p&gt;

&lt;p&gt;Note that because the smart contract will only honor a single message, no per-message nonce is required. The address of the smart contract is still used to prevent a message intended for one payment channel from being used for a different channel.&lt;/p&gt;

&lt;p&gt;Payment messages can be constructed and signed in any language that supports cryptographic hashing and signing operations. The following code is written in JavaScript and uses &lt;a href=&#34;https://github.com/ethereumjs/ethereumjs-abi&#34;&gt;&lt;code&gt;ethereumjs-abi&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;constructPaymentMessage(contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.ABI.soliditySHA3(&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;address&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount],&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signMessage(message,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;web3.personal.sign(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;message.toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount,&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;callback);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// contractAddress is used to prevent cross-contract replay attacks.&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// amount, in wei, specifies how much ether should be sent.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signPayment(contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;constructPaymentMessage(contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;signMessage(message,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;verifying-payments&#34;&gt;Verifying Payments&lt;/h2&gt;

&lt;p&gt;Unlike in my &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;last signature example&lt;/a&gt;, messages in a payment channel aren&amp;rsquo;t redeemed right away. The recipient keeps track of the latest message and redeems it when it&amp;rsquo;s time to close the payment channel. This means it&amp;rsquo;s &lt;em&gt;critical&lt;/em&gt; that the recipient perform their own verification of each message. Otherwise there is no guarantee that the recipient will be able to get paid in the end.&lt;/p&gt;

&lt;p&gt;The recipient should verify each message using the following process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify that the contract address in the message matches the payment channel.&lt;/li&gt;
&lt;li&gt;Verify that the new total is the expected amount.&lt;/li&gt;
&lt;li&gt;Verify that the new total does not exceed the amount of ether escrowed.&lt;/li&gt;
&lt;li&gt;Verify that the signature is valid and comes from the payment channel sender.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first three steps are straightforward. The final step can be performed a number of ways, but if it&amp;rsquo;s being done in JavaScript, I recommend the &lt;a href=&#34;https://github.com/ethereumjs/ethereumjs-util&#34;&gt;&lt;code&gt;ethereumjs-util&lt;/code&gt;&lt;/a&gt; library. The following code borrows the &lt;code&gt;constructMessage&lt;/code&gt; function from the signing code above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// This mimics the prefixing behavior of the eth_sign JSON-RPC method.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;prefixed(hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.ABI.soliditySHA3(&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;bytes32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;\x19Ethereum Signed Message:\n32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash]&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;recoverSigner(message,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;split&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.fromRpcSig(signature);&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;publicKey&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.ecrecover(message,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;split.v,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;split.r,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;split.s);&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.pubToAddress(publicKey).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;isValidSignature(contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;expectedSigner)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;prefixed(constructPaymentMessage(contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount));&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;recoverSigner(message,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signature);&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signer.toLowerCase()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.Util.stripHexPrefix(expectedSigner).toLowerCase();&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;closing-the-payment-channel&#34;&gt;Closing the Payment Channel&lt;/h2&gt;

&lt;p&gt;When the recipient is ready to receive their funds, it&amp;rsquo;s time to close the payment channel by calling a &lt;code&gt;close&lt;/code&gt; function on the smart contract. Closing the channel pays the recipient the ether they&amp;rsquo;re owed and destroys the contract, sending any remaining ether back to the sender. To close the channel, the recipient needs to share a message signed by the sender.&lt;/p&gt;

&lt;p&gt;The smart contract must verify that the message contains a valid signature from the sender. The process for doing this verification is the same as the process the recipient uses. The Solidity functions &lt;code&gt;isValidSignature&lt;/code&gt; and &lt;code&gt;recoverSigner&lt;/code&gt; work just like their JavaScript counterparts in the previous section. The latter is borrowed from the &lt;code&gt;ReceiverPays&lt;/code&gt; contract in &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/&#34;&gt;&amp;ldquo;Signing and Verifying Messages in Ethereum&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Check that the signature is from the payment sender.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The recipient can close the channel at any time by presenting a signed&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// amount from the sender. The recipient will be sent that amount, and the&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// remainder will go back to the sender.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;close&lt;/code&gt; function can only be called by the payment channel recipient, who will naturally pass the most recent payment message because that message carries the highest total owed. If the sender were allowed to call this function, they could provide a message with a lower amount and cheat the recipient out of what they&amp;rsquo;re owed.&lt;/p&gt;

&lt;p&gt;The function verifies the signed message matches the given parameters. If everything checks out, the recipient is sent their portion of the ether, and the sender is sent the rest via a &lt;code&gt;selfdestruct&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;channel-expiration&#34;&gt;Channel Expiration&lt;/h2&gt;

&lt;p&gt;The recipient can close the payment channel at any time, but if they fail to do so, the sender needs a way to recover their escrowed funds. An &lt;code&gt;expiration&lt;/code&gt; time was set at the time of contract deployment. Once that time is reached, the sender can call &lt;code&gt;claimTimeout&lt;/code&gt; to recover their funds.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If the timeout is reached without the recipient closing the channel, then&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the ether is released back to the sender.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After this function is called, the recipient can no longer receive any ether, so it&amp;rsquo;s important that the recipient close the channel before the expiration is reached. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Payment channels support safe, off-chain fund transfers while avoiding per-transfer Ethereum transaction fees.&lt;/li&gt;
&lt;li&gt;Payments are cumulative, and only one is redeemed when closing the channel.&lt;/li&gt;
&lt;li&gt;Transfers are guaranteed via escrowed funds and cryptographic signatures.&lt;/li&gt;
&lt;li&gt;A timeout protects the sender&amp;rsquo;s funds from an uncooperative recipient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;simplePaymentChannel.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjA7Cgpjb250cmFjdCBTaW1wbGVQYXltZW50Q2hhbm5lbCB7CiAgICBhZGRyZXNzIHB1YmxpYyBzZW5kZXI7ICAgICAvLyBUaGUgYWNjb3VudCBzZW5kaW5nIHBheW1lbnRzLgogICAgYWRkcmVzcyBwdWJsaWMgcmVjaXBpZW50OyAgLy8gVGhlIGFjY291bnQgcmVjZWl2aW5nIHRoZSBwYXltZW50cy4KICAgIHVpbnQyNTYgcHVibGljIGV4cGlyYXRpb247IC8vIFRpbWVvdXQgaW4gY2FzZSB0aGUgcmVjaXBpZW50IG5ldmVyIGNsb3Nlcy4KCiAgICBmdW5jdGlvbiBTaW1wbGVQYXltZW50Q2hhbm5lbChhZGRyZXNzIF9yZWNpcGllbnQsIHVpbnQyNTYgZHVyYXRpb24pCiAgICAgICAgcHVibGljCiAgICAgICAgcGF5YWJsZQogICAgewogICAgICAgIHNlbmRlciA9IG1zZy5zZW5kZXI7CiAgICAgICAgcmVjaXBpZW50ID0gX3JlY2lwaWVudDsKICAgICAgICBleHBpcmF0aW9uID0gbm93ICsgZHVyYXRpb247CiAgICB9CgogICAgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZSh1aW50MjU2IGFtb3VudCwgYnl0ZXMgc2lnbmF0dXJlKQogICAgICAgIGludGVybmFsCiAgICAgICAgdmlldwogICAgICAgIHJldHVybnMgKGJvb2wpCiAgICB7CiAgICAgICAgYnl0ZXMzMiBtZXNzYWdlID0gcHJlZml4ZWQoa2VjY2FrMjU2KHRoaXMsIGFtb3VudCkpOwoKICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBzaWduYXR1cmUgaXMgZnJvbSB0aGUgcGF5bWVudCBzZW5kZXIuCiAgICAgICAgcmV0dXJuIHJlY292ZXJTaWduZXIobWVzc2FnZSwgc2lnbmF0dXJlKSA9PSBzZW5kZXI7CiAgICB9CgogICAgLy8gVGhlIHJlY2lwaWVudCBjYW4gY2xvc2UgdGhlIGNoYW5uZWwgYXQgYW55IHRpbWUgYnkgcHJlc2VudGluZyBhIHNpZ25lZAogICAgLy8gYW1vdW50IGZyb20gdGhlIHNlbmRlci4gVGhlIHJlY2lwaWVudCB3aWxsIGJlIHNlbnQgdGhhdCBhbW91bnQsIGFuZCB0aGUKICAgIC8vIHJlbWFpbmRlciB3aWxsIGdvIGJhY2sgdG8gdGhlIHNlbmRlci4KICAgIGZ1bmN0aW9uIGNsb3NlKHVpbnQyNTYgYW1vdW50LCBieXRlcyBzaWduYXR1cmUpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHJlY2lwaWVudCk7CiAgICAgICAgcmVxdWlyZShpc1ZhbGlkU2lnbmF0dXJlKGFtb3VudCwgc2lnbmF0dXJlKSk7CgogICAgICAgIHJlY2lwaWVudC50cmFuc2ZlcihhbW91bnQpOwogICAgICAgIHNlbGZkZXN0cnVjdChzZW5kZXIpOwogICAgfQoKICAgIC8vIFRoZSBzZW5kZXIgY2FuIGV4dGVuZCB0aGUgZXhwaXJhdGlvbiBhdCBhbnkgdGltZS4KICAgIGZ1bmN0aW9uIGV4dGVuZCh1aW50MjU2IG5ld0V4cGlyYXRpb24pIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IHNlbmRlcik7CiAgICAgICAgcmVxdWlyZShuZXdFeHBpcmF0aW9uID4gZXhwaXJhdGlvbik7CgogICAgICAgIGV4cGlyYXRpb24gPSBuZXdFeHBpcmF0aW9uOwogICAgfQoKICAgIC8vIElmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQgd2l0aG91dCB0aGUgcmVjaXBpZW50IGNsb3NpbmcgdGhlIGNoYW5uZWwsIHRoZW4KICAgIC8vIHRoZSBldGhlciBpcyByZWxlYXNlZCBiYWNrIHRvIHRoZSBzZW5kZXIuCiAgICBmdW5jdGlvbiBjbGFpbVRpbWVvdXQoKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUobm93ID49IGV4cGlyYXRpb24pOwogICAgICAgIHNlbGZkZXN0cnVjdChzZW5kZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwbGl0U2lnbmF0dXJlKGJ5dGVzIHNpZykKICAgICAgICBpbnRlcm5hbAogICAgICAgIHB1cmUKICAgICAgICByZXR1cm5zICh1aW50OCwgYnl0ZXMzMiwgYnl0ZXMzMikKICAgIHsKICAgICAgICByZXF1aXJlKHNpZy5sZW5ndGggPT0gNjUpOwoKICAgICAgICBieXRlczMyIHI7CiAgICAgICAgYnl0ZXMzMiBzOwogICAgICAgIHVpbnQ4IHY7CgogICAgICAgIGFzc2VtYmx5IHsKICAgICAgICAgICAgLy8gZmlyc3QgMzIgYnl0ZXMsIGFmdGVyIHRoZSBsZW5ndGggcHJlZml4CiAgICAgICAgICAgIHIgOj0gbWxvYWQoYWRkKHNpZywgMzIpKQogICAgICAgICAgICAvLyBzZWNvbmQgMzIgYnl0ZXMKICAgICAgICAgICAgcyA6PSBtbG9hZChhZGQoc2lnLCA2NCkpCiAgICAgICAgICAgIC8vIGZpbmFsIGJ5dGUgKGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgMzIgYnl0ZXMpCiAgICAgICAgICAgIHYgOj0gYnl0ZSgwLCBtbG9hZChhZGQoc2lnLCA5NikpKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICh2LCByLCBzKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWNvdmVyU2lnbmVyKGJ5dGVzMzIgbWVzc2FnZSwgYnl0ZXMgc2lnKQogICAgICAgIGludGVybmFsCiAgICAgICAgcHVyZQogICAgICAgIHJldHVybnMgKGFkZHJlc3MpCiAgICB7CiAgICAgICAgdWludDggdjsKICAgICAgICBieXRlczMyIHI7CiAgICAgICAgYnl0ZXMzMiBzOwoKICAgICAgICAodiwgciwgcykgPSBzcGxpdFNpZ25hdHVyZShzaWcpOwoKICAgICAgICByZXR1cm4gZWNyZWNvdmVyKG1lc3NhZ2UsIHYsIHIsIHMpOwogICAgfQoKICAgIC8vIEJ1aWxkcyBhIHByZWZpeGVkIGhhc2ggdG8gbWltaWMgdGhlIGJlaGF2aW9yIG9mIGV0aF9zaWduLgogICAgZnVuY3Rpb24gcHJlZml4ZWQoYnl0ZXMzMiBoYXNoKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKGJ5dGVzMzIpIHsKICAgICAgICByZXR1cm4ga2VjY2FrMjU2KCJceDE5RXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6XG4zMiIsIGhhc2gpOwogICAgfQp9Cg==&#34; download=&#39;simplePaymentChannel.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimplePaymentChannel&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The account sending payments.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The account receiving the payments.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Timeout in case the recipient never closes.&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimplePaymentChannel&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;duration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;duration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Check that the signature is from the payment sender.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The recipient can close the channel at any time by presenting a signed&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// amount from the sender. The recipient will be sent that amount, and the&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// remainder will go back to the sender.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;isValidSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;signature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;recipient&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The sender can extend the expiration at any time.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;newExpiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newExpiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// If the timeout is reached without the recipient closing the channel, then&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the ether is released back to the sender.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimTimeout&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;expiration&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;In the simple payment channel I introduce in this post, a long-lived channel is undesirable because all funds must be escrowed up front, and neither party can access the funds until the channel is closed. I will show how to overcome these limitations in a future post.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;There&amp;rsquo;s no reason not to allow the &lt;em&gt;sender&lt;/em&gt; to extend expiration. I&amp;rsquo;ve included a function in the full source code that does this.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:2&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing an Estate Planning Contract</title>
      <link>https://programtheblockchain.com/posts/2018/02/20/writing-an-estate-planning-contract/</link>
      <pubDate>Tue, 20 Feb 2018 13:05:14 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/20/writing-an-estate-planning-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post will demonstrate how to write a smart contract that transfers your ether to a beneficiary after you die.  It assumes that you have read our previous post on dealing with
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/12/writing-a-contract-that-handles-time/&#34;&gt;time&lt;/a&gt;
on the blockchain.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Suppose that you want to bequeath your ether to a beneficiary after you die.  How would you transfer access to your ether in a &lt;em&gt;trustless&lt;/em&gt; fashion?  The answer, of course, is with a smart contract!  The smart contract will be responsible for many operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The contract will hold ether on your behalf while you are alive, allowing you to make deposits and withdrawals freely.&lt;/li&gt;
&lt;li&gt;The contract will include a mechanism for determining (with some confidence) that you are dead.&lt;/li&gt;
&lt;li&gt;The contract will allow your beneficiary access to the ether after you are deemed dead.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;contract-inheritance&#34;&gt;Contract Inheritance&lt;/h2&gt;

&lt;p&gt;I am going to use this opportunity to introduce a common Solidity programming practice called &amp;ldquo;inheritance&amp;rdquo;, which enables one contract to inherit functions, modifiers and variables from another contract.  This is very similar to inheritance in many object-oriented languages.&lt;/p&gt;

&lt;p&gt;There are many common patterns in Solidity programs that are typically expressed via inheritance.  Two common patterns are contracts having owners (with special privileges), and contracts allowing their owners to kill the contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Ownable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Ownable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;kill&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Estate&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above uses inheritance to provide my &lt;code&gt;Estate&lt;/code&gt; contract with the variables, modifiers, and functions of the &lt;code&gt;Ownable&lt;/code&gt; and &lt;code&gt;Mortal&lt;/code&gt; contracts (i.e., &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;onlyOwner&lt;/code&gt;, and &lt;code&gt;kill&lt;/code&gt;.)&lt;/p&gt;

&lt;h2 id=&#34;beneficiary&#34;&gt;Beneficiary&lt;/h2&gt;

&lt;p&gt;In addition to having an owner account, the &lt;code&gt;Estate&lt;/code&gt; contract has a beneficiary account.  The beneficiary stands to inherit the contract from the owner after the owner has died.  Just as some contract functionality is restricted to the owner, some will be restricted to the beneficiary:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Estate&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyBeneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;am-i-dead-or-not&#34;&gt;Am I Dead Or Not?&lt;/h2&gt;

&lt;p&gt;The interesting challenge this contract must address is how to determine if its owner has died.  This is difficult because death happens &lt;em&gt;off&lt;/em&gt; the blockchain, so the contract needs a way to learn of an off-chain event.  Rather than solving that problem, I am going to employ a proxy test for death&amp;mdash;the lack of a &amp;ldquo;heartbeat&amp;rdquo; during a given period of time.&lt;/p&gt;

&lt;p&gt;Specifically, the design will be one where the beneficiary asserts that the owner has died, and then the owner must provide a &amp;ldquo;heartbeat&amp;rdquo; transaction within a waiting period.  If the owner makes the heartbeat before the period expires, then he hasn&amp;rsquo;t died.  If not, then the contract considers him dead, and it will transfer ownership to the beneficiary upon request.&lt;/p&gt;

&lt;p&gt;To monitor the state of the assertions of death and the period of the challenge, the contract will maintain two time values:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Duration of challenge period&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// End of challenge period&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;waitingPeriodLength&lt;/code&gt; period is the length of time after the beneficiary asserts death that must be waited for the owner to possibly prove they are alive.  &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; is the time of the end of that waiting period.&lt;/p&gt;

&lt;p&gt;To keep things simple, I will use a sentinel value for &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; that is so far out in the future as to be unimaginable.  This will be the value when the beneficiary has &lt;em&gt;not&lt;/em&gt; asserted that the owner is dead.&lt;/p&gt;

&lt;p&gt;I will define a &lt;code&gt;heartbeat&lt;/code&gt; modifier that will reset the &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; value to that end-of-ages time.  The modifier will be used on every routine where the owner proves he is alive:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// approximate age of the universe&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;heartbeat&lt;/code&gt; modifier is a little unusual because it will add the code to the &lt;em&gt;end&lt;/em&gt; of the function it modifies.  This will allow &lt;code&gt;heartbeat&lt;/code&gt; to be used later in the &lt;code&gt;claimInheritance&lt;/code&gt; function that tests the (current) value of &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; upon entry.&lt;/p&gt;

&lt;p&gt;Now that we have all the scaffolding in place, I can show the simple constructor:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Estate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;waitingPeriodLength&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The constructor directly sets the &lt;code&gt;beneficiary&lt;/code&gt; and &lt;code&gt;waitingPeriodLength&lt;/code&gt; variables as well as setting &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; via the &lt;code&gt;heartbeat&lt;/code&gt; modifier.&lt;/p&gt;

&lt;h2 id=&#34;asserting-death&#34;&gt;Asserting Death&lt;/h2&gt;

&lt;p&gt;The beneficiary can assert that the owner has died with the &lt;code&gt;assertDeath&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Challenge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;assertDeath&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyBeneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Challenge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;assertDeath&lt;/code&gt; sets &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; out in the future by &lt;code&gt;waitingPeriodLength&lt;/code&gt; seconds from now.  If the owner doesn&amp;rsquo;t interact with the contract to reset &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; (via &lt;code&gt;heartbeat&lt;/code&gt;), then the beneficiary can claim ownership.&lt;/p&gt;

&lt;p&gt;As a convenience to the (possibly not dead) owner, &lt;code&gt;assertDeath&lt;/code&gt; logs an event that the owner can monitor.&lt;/p&gt;

&lt;h2 id=&#34;claiming-ownership&#34;&gt;Claiming Ownership&lt;/h2&gt;

&lt;p&gt;The beneficiary can claim ownership and set his beneficiary with &lt;code&gt;claimInheritance&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimInheritance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newBeneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;onlyBeneficiary&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// waiting period expired&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newBeneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;One subtlety to &lt;code&gt;claimInheritance&lt;/code&gt; is its use the &lt;code&gt;heartbeat&lt;/code&gt; modifier.  That is needed to reset the &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; to its sentinel value for the new owner.&lt;/p&gt;

&lt;p&gt;In deciding what the contract should do after the owner died, I had a design choice.  I chose to have the smart contract&amp;rsquo;s ownership change, but I could just as easily have had the contract self-destruct and send the ether to the beneficiary.  I chose changing ownership because it seemed elegant to me because the new owner may face the same estate planning challenge as the previous owner.&lt;/p&gt;

&lt;h2 id=&#34;holding-ether-balances&#34;&gt;Holding Ether Balances&lt;/h2&gt;

&lt;p&gt;Of course, it&amp;rsquo;s important for the contract&amp;rsquo;s owner to be able to access his ether while alive.  The contract has a simple mechanism for the owner to deposit and withdraw funds.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nothing else to do&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;deposit&lt;/code&gt; and &lt;code&gt;withdraw&lt;/code&gt; routines do a few subtle things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both routines capture much of their functionality in the &lt;code&gt;onlyOwner&lt;/code&gt; and &lt;code&gt;heartbeat&lt;/code&gt; modifiers.&lt;/li&gt;
&lt;li&gt;Because both routines are limited to the owner, it makes sense for both to serve as heartbeats (and update &lt;code&gt;endOfWaitingPeriod&lt;/code&gt; to its sentinel value).  In fact, a &lt;code&gt;deposit&lt;/code&gt; of zero ether acts as a simple, low-gas heartbeat for the owner.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;withdraw&lt;/code&gt; does not check whether the contract has sufficient ether because that check will be done by the &lt;code&gt;transfer&lt;/code&gt; function.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;estate.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBPd25hYmxlIHsKICAgIGFkZHJlc3Mgb3duZXIgPSBtc2cuc2VuZGVyOwogICAgbW9kaWZpZXIgb25seU93bmVyIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIpOwogICAgICAgIF87CiAgICB9Cn0KCmNvbnRyYWN0IE1vcnRhbCBpcyBPd25hYmxlIHsKICAgIGZ1bmN0aW9uIGtpbGwoKSBwdWJsaWMgb25seU93bmVyIHsKICAgICAgICBzZWxmZGVzdHJ1Y3QobXNnLnNlbmRlcik7CiAgICB9Cn0KCmNvbnRyYWN0IEVzdGF0ZSBpcyBNb3J0YWwgewogICAgYWRkcmVzcyBiZW5lZmljaWFyeTsKICAgIG1vZGlmaWVyIG9ubHlCZW5lZmljaWFyeSB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IGJlbmVmaWNpYXJ5KTsKICAgICAgICBfOwogICAgfQoKICAgIHVpbnQyNTYgd2FpdGluZ1BlcmlvZExlbmd0aDsKICAgIHVpbnQyNTYgZW5kT2ZXYWl0aW5nUGVyaW9kOwogICAgbW9kaWZpZXIgaGVhcnRiZWF0IHsKICAgICAgICBfOwogICAgICAgIGVuZE9mV2FpdGluZ1BlcmlvZCA9IDEwICoqIDE4OyAgLy8gYXBwcm94aW1hdGUgYWdlIG9mIHVuaXZlcnNlCiAgICB9CgogICAgZnVuY3Rpb24gRXN0YXRlKGFkZHJlc3MgX2JlbmVmaWNpYXJ5LCB1aW50MjU2IF93YWl0aW5nUGVyaW9kTGVuZ3RoKQogICAgICAgIHB1YmxpYwogICAgICAgIGhlYXJ0YmVhdAogICAgewogICAgICAgIGJlbmVmaWNpYXJ5ID0gX2JlbmVmaWNpYXJ5OwogICAgICAgIHdhaXRpbmdQZXJpb2RMZW5ndGggPSBfd2FpdGluZ1BlcmlvZExlbmd0aDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXBvc2l0KCkgcHVibGljIHBheWFibGUgb25seU93bmVyIGhlYXJ0YmVhdCB7IH0KCiAgICBmdW5jdGlvbiB3aXRoZHJhdyh1aW50MjU2IGFtb3VudCkgcHVibGljIG9ubHlPd25lciBoZWFydGJlYXQgewogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYW1vdW50KTsKICAgIH0KCiAgICBldmVudCBDaGFsbGVuZ2UodWludDI1NiB0aW1lc3RhbXApOwoKICAgIGZ1bmN0aW9uIGFzc2VydERlYXRoKCkgcHVibGljIG9ubHlCZW5lZmljaWFyeSB7CiAgICAgICAgZW5kT2ZXYWl0aW5nUGVyaW9kID0gbm93ICsgd2FpdGluZ1BlcmlvZExlbmd0aDsKICAgICAgICBlbWl0IENoYWxsZW5nZShub3cpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYWltSW5oZXJpdGFuY2UoYWRkcmVzcyBuZXdCZW5lZmljaWFyeSkKICAgICAgICBwdWJsaWMKICAgICAgICBvbmx5QmVuZWZpY2lhcnkKICAgICAgICBoZWFydGJlYXQKICAgIHsKICAgICAgICByZXF1aXJlKG5vdyA&amp;#43;PSBlbmRPZldhaXRpbmdQZXJpb2QpOwoKICAgICAgICBvd25lciA9IG1zZy5zZW5kZXI7CiAgICAgICAgYmVuZWZpY2lhcnkgPSBuZXdCZW5lZmljaWFyeTsKICAgIH0KfQo=&#34; download=&#39;estate.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Ownable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Ownable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;kill&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Estate&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Mortal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyBeneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// approximate age of universe&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Estate&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_beneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;waitingPeriodLength&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Challenge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;assertDeath&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyBeneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;waitingPeriodLength&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Challenge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimInheritance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newBeneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;onlyBeneficiary&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;heartbeat&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endOfWaitingPeriod&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;beneficiary&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newBeneficiary&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Signing and Verifying Messages in Ethereum</title>
      <link>https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/</link>
      <pubDate>Sat, 17 Feb 2018 06:47:55 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/</guid>
      <description>&lt;p&gt;Cryptographic signatures are a powerful primitive in Ethereum. Signatures are used to authorize transactions, but they&amp;rsquo;re a more general tool that&amp;rsquo;s available to smart contracts. Signatures can be used to prove to a smart contract that a certain account approved a certain message.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;In this post, I&amp;rsquo;ll build a simple smart contract that lets me transmit ether in an unusual way. Instead of calling a function myself to initiate a payment, I&amp;rsquo;ll let the receiver of the payment do that&amp;mdash;and therefore pay the transaction fee! Only authorized payments will be allowed, thanks to cryptographic signatures that I will make and send off-chain (e.g. via email).&lt;/p&gt;

&lt;p&gt;Paying someone with the &lt;code&gt;ReceiverPays&lt;/code&gt; contract works a lot like writing a check. The person receiving the payment gets to take money directly out of my bank account, but only if they have a valid check bearing my signature.&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/images/receiverpays-signature.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/receiverpays-signature.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;ReceiverPays&lt;/code&gt; contract holds ether on behalf of its owner and allows that ether to be withdrawn when authorized by a cryptographic signature:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The owner deploys &lt;code&gt;ReceiverPays&lt;/code&gt;, attaching enough ether to cover the payments that will be made.&lt;/li&gt;
&lt;li&gt;The owner authorizes a payment by cryptographically signing a message with their private key.&lt;/li&gt;
&lt;li&gt;The owner sends the signed message to the designated recipient. The message does not need to be kept secret, and the mechanism for sending it doesn&amp;rsquo;t matter. It can be sent via email, instant message, or even a public forum.&lt;/li&gt;
&lt;li&gt;The recipient claims their payment by presenting the signed message to the smart contract. The smart contract verifies its authenticity and then releases the funds.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;creating-the-signature&#34;&gt;Creating the Signature&lt;/h2&gt;

&lt;p&gt;Signing a message with a private key does not require interacting with the Ethereum network. It can be done completely offline, and every major programming language has the necessary cryptographic libraries to do it. The signature algorithm Ethereum has built-in support for is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm&#34;&gt;Elliptic Curve Digital Signature Algorithm (EDCSA)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this post, I&amp;rsquo;ll focus on signing messages in the web browser using web3.js and MetaMask.&lt;/p&gt;

&lt;p&gt;There are still a number of ways to sign messages using web3.js, and, unfortunately, different methods sign data in incompatible ways. Members of the community are actively working to standardize on a new way to sign messages (&lt;a href=&#34;https://github.com/ethereum/EIPs/pull/712&#34;&gt;EIP-712&lt;/a&gt;) that has a number of other security benefits. For now, though, my advice is to stick with the most standard format of signing, as specified by the &lt;a href=&#34;https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign&#34;&gt;&lt;code&gt;eth_sign&lt;/code&gt; JSON-RPC method&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The sign method calculates an Ethereum specific signature with:
&lt;code&gt;sign(keccak256(&amp;quot;\x19Ethereum Signed Message:\n&amp;quot; + len(message) + message)))&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature. This prevents misuse where a malicious DApp can sign arbitrary data (e.g. transaction) and use the signature to impersonate the victim.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At least in MetaMask, this algorithm is followed best by the web3.js function &lt;code&gt;web3.personal.sign&lt;/code&gt;, so I recommend using that: &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Hashing first makes a few things easier.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.sha3(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;message to sign&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;web3.personal.sign(hash,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Recall that the prefix includes the length of the message. Hashing first means the message will always be 32 bytes long, which means the prefix is always the same. This makes life easier, particularly on the Solidity side, as I&amp;rsquo;ll demonstrate later in this post.&lt;/p&gt;

&lt;h2 id=&#34;what-to-sign&#34;&gt;What to Sign&lt;/h2&gt;

&lt;p&gt;For a signature to represent authorization to take some action, it&amp;rsquo;s important that the message specify exactly what&amp;rsquo;s being authorized. For a contract that fulfills payments, the signed message must include the address of the recipient and the amount that is to be transferred. In addition, the message should include data that protects against &lt;em&gt;replay attacks&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&#34;avoiding-replay-attacks&#34;&gt;Avoiding Replay Attacks&lt;/h3&gt;

&lt;p&gt;A replay attack is when a signature is used again (&amp;ldquo;replayed&amp;rdquo;) to claim authorization for a second action. For our example, it would be a serious security flaw if the recipient of a payment could submit the same signature again to receive a second payment. Just as in &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/&#34;&gt;Ethereum transactions themselves&lt;/a&gt;, messages typically include a nonce to protect against replay attacks. The smart contract checks that no nonce is reused:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There&amp;rsquo;s another kind of replay attack that we need to protect against. Suppose I deploy the &lt;code&gt;ReceiverPays&lt;/code&gt; smart contract, make some payments, and then destroy the contract. Later, I would like to make more payments, so I decide to deploy the &lt;code&gt;RecipientPays&lt;/code&gt; smart contract again. The new deployed instance of the contract doesn&amp;rsquo;t know about the used nonces from the previous deployment, so it will happily pay in response to any of the old signatures again.&lt;/p&gt;

&lt;p&gt;A simple way to protect against this type of replay attack is to make sure the message includes the &lt;em&gt;contract&amp;rsquo;s&lt;/em&gt; address. The new contract will reject all signatures that reference the wrong (old) address.&lt;/p&gt;

&lt;h3 id=&#34;packing-arguments&#34;&gt;Packing Arguments&lt;/h3&gt;

&lt;p&gt;Now that I&amp;rsquo;ve identified what information to include in the signed message, I&amp;rsquo;m ready to put the message together, hash it, and sign it. Solidity&amp;rsquo;s &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/units-and-global-variables.html#mathematical-and-cryptographic-functions&#34;&gt;&lt;code&gt;keccak256/sha3&lt;/code&gt; function&lt;/a&gt; hashes multiple arguments by first concatenating them in a &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/units-and-global-variables.html#mathematical-and-cryptographic-functions&#34;&gt;tightly packed form&lt;/a&gt;. For the hash generated on the client to match the one generated in the smart contract, the arguments must be concatenated in the same way.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&#34;https://github.com/ethereumjs/ethereumjs-abi&#34;&gt;&lt;code&gt;ethereumjs-abi&lt;/code&gt;&lt;/a&gt; library &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; provides a function called &lt;code&gt;soliditySHA3&lt;/code&gt; that mimics the behavior of Solidity&amp;rsquo;s &lt;code&gt;keccak256&lt;/code&gt; function. It accepts an array of values as well as an array of their Solidity types so it can serialize the values accordingly.&lt;/p&gt;

&lt;p&gt;Putting it all together, here&amp;rsquo;s a JavaScript function that creates the proper signature for the &lt;code&gt;ReceiverPays&lt;/code&gt; example: &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// recipient is the address that should be paid.&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// amount, in wei, specifies how much ether should be sent.&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nonce can be any unique number, used to prevent replay attacks.&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// contractAddress is used to prevent cross-contract replay attacks.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;signPayment(recipient,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;nonce,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contractAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0x&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;ethereumjs.ABI.soliditySHA3(&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;address&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;address&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;[recipient,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;amount,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;nonce,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;contractAddress]&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;).toString(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;hex&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;web3.personal.sign(hash,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;callback);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;recovering-the-message-signer-in-solidity&#34;&gt;Recovering the Message Signer in Solidity&lt;/h2&gt;

&lt;p&gt;In general, &lt;a href=&#34;https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm&#34;&gt;ECDSA signatures&lt;/a&gt; consist of two parameters, &lt;em&gt;r&lt;/em&gt; and &lt;em&gt;s&lt;/em&gt;. Signatures in Ethereum include a third parameter, &lt;em&gt;v&lt;/em&gt;, which provides additional information that can be used to recover which account&amp;rsquo;s private key was used to sign the message. This same mechanism is how Ethereum determines which account sent a given transaction.&lt;/p&gt;

&lt;p&gt;Solidity provides a built-in function &lt;a href=&#34;https://solidity.readthedocs.io/en/develop/units-and-global-variables.html#mathematical-and-cryptographic-functions&#34;&gt;&lt;code&gt;ecrecover&lt;/code&gt;&lt;/a&gt; that accepts a message along with the &lt;em&gt;r&lt;/em&gt;, &lt;em&gt;s&lt;/em&gt;, and &lt;em&gt;v&lt;/em&gt; parameters and returns the address that was used to sign the message.&lt;/p&gt;

&lt;h3 id=&#34;extracting-the-signature-parameters&#34;&gt;Extracting the Signature Parameters&lt;/h3&gt;

&lt;p&gt;Signatures produced by web3.js are the concatenation of &lt;em&gt;r&lt;/em&gt;, &lt;em&gt;s&lt;/em&gt;, and &lt;em&gt;v&lt;/em&gt;, so a necessary first step is splitting those parameters back out. This process can be done on the client, but I find it more convenient to do it inside the smart contract. This means only one signature parameter needs to be sent rather than three.&lt;/p&gt;

&lt;p&gt;Unfortunately, splitting apart a &lt;code&gt;bytes&lt;/code&gt; array into component parts is a little messy. I&amp;rsquo;m making use of &lt;a href=&#34;https://solidity.readthedocs.io/en/develop/assembly.html&#34;&gt;inline assembly&lt;/a&gt; to do the job:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of that code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamically-sized arrays (including &lt;code&gt;bytes&lt;/code&gt;) are represented in memory by a 32-byte length followed by the actual data. The code here starts reading data at byte 32 to skip past that length. The &lt;code&gt;require&lt;/code&gt; at the top of the function ensures the signature is the correct length.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;r&lt;/em&gt; and &lt;em&gt;s&lt;/em&gt; are 32 bytes each and together make up the first 64 bytes of the signature.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;v&lt;/em&gt; is the 65th byte, which can be found at byte offset 96 (32 bytes for the length, 64 bytes for &lt;em&gt;r&lt;/em&gt; and &lt;em&gt;s&lt;/em&gt;). The &lt;code&gt;mload&lt;/code&gt; opcode loads 32 bytes at a time, so the function then needs to extract just the first byte of the word that was read. This is what &lt;code&gt;byte(0, ...)&lt;/code&gt; does.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;computing-the-message-hash&#34;&gt;Computing the Message Hash&lt;/h3&gt;

&lt;p&gt;In addition to the &lt;em&gt;r&lt;/em&gt;, &lt;em&gt;s&lt;/em&gt;, and &lt;em&gt;v&lt;/em&gt; parameters from the signature, recovering the message signer requires knowledge of the message that was signed. The message hash needs to be recomputed from the sent parameters along with the known prefix.&lt;/p&gt;

&lt;p&gt;It may seem tempting at first to just have the caller pass in the message that was signed, but that would only prove that &lt;em&gt;some&lt;/em&gt; message was signed by the owner. The smart contract needs to know exactly what parameters were signed, and so it must recreate the message from the parameters and use that for signature verification:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// This recreates the message that was signed on the client.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, the implementation of &lt;code&gt;recoverSigner&lt;/code&gt; is straightforward:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Signed messages provide a way to authenticate a message to a smart contract.&lt;/li&gt;
&lt;li&gt;Signed messages may need a nonce to protect against replay attacks.&lt;/li&gt;
&lt;li&gt;Signed messages may need to include the contracts&amp;rsquo;s address to protect against replay attacks.&lt;/li&gt;
&lt;li&gt;Until a better signature standard is adopted, I recommend following the behavior of the &lt;a href=&#34;https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign&#34;&gt;&lt;code&gt;eth_sign&lt;/code&gt; JSON-RPC method&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;receiverPays.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjA7Cgpjb250cmFjdCBSZWNlaXZlclBheXMgewogICAgYWRkcmVzcyBvd25lciA9IG1zZy5zZW5kZXI7CgogICAgbWFwcGluZyh1aW50MjU2ID0&amp;#43;IGJvb2wpIHVzZWROb25jZXM7CgogICAgLy8gRnVuZHMgYXJlIHNlbnQgYXQgZGVwbG95bWVudCB0aW1lLgogICAgZnVuY3Rpb24gUmVjZWl2ZXJQYXlzKCkgcHVibGljIHBheWFibGUgeyB9CgoKICAgIGZ1bmN0aW9uIGNsYWltUGF5bWVudCh1aW50MjU2IGFtb3VudCwgdWludDI1NiBub25jZSwgYnl0ZXMgc2lnKSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoIXVzZWROb25jZXNbbm9uY2VdKTsKICAgICAgICB1c2VkTm9uY2VzW25vbmNlXSA9IHRydWU7CgogICAgICAgIC8vIFRoaXMgcmVjcmVhdGVzIHRoZSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZCBvbiB0aGUgY2xpZW50LgogICAgICAgIGJ5dGVzMzIgbWVzc2FnZSA9IHByZWZpeGVkKGtlY2NhazI1Nihtc2cuc2VuZGVyLCBhbW91bnQsIG5vbmNlLCB0aGlzKSk7CgogICAgICAgIHJlcXVpcmUocmVjb3ZlclNpZ25lcihtZXNzYWdlLCBzaWcpID09IG93bmVyKTsKCiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhbW91bnQpOwogICAgfQoKICAgIC8vIERlc3Ryb3kgY29udHJhY3QgYW5kIHJlY2xhaW0gbGVmdG92ZXIgZnVuZHMuCiAgICBmdW5jdGlvbiBraWxsKCkgcHVibGljIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIpOwogICAgICAgIHNlbGZkZXN0cnVjdChtc2cuc2VuZGVyKTsKICAgIH0KCgogICAgLy8gU2lnbmF0dXJlIG1ldGhvZHMKCiAgICBmdW5jdGlvbiBzcGxpdFNpZ25hdHVyZShieXRlcyBzaWcpCiAgICAgICAgaW50ZXJuYWwKICAgICAgICBwdXJlCiAgICAgICAgcmV0dXJucyAodWludDgsIGJ5dGVzMzIsIGJ5dGVzMzIpCiAgICB7CiAgICAgICAgcmVxdWlyZShzaWcubGVuZ3RoID09IDY1KTsKCiAgICAgICAgYnl0ZXMzMiByOwogICAgICAgIGJ5dGVzMzIgczsKICAgICAgICB1aW50OCB2OwoKICAgICAgICBhc3NlbWJseSB7CiAgICAgICAgICAgIC8vIGZpcnN0IDMyIGJ5dGVzLCBhZnRlciB0aGUgbGVuZ3RoIHByZWZpeAogICAgICAgICAgICByIDo9IG1sb2FkKGFkZChzaWcsIDMyKSkKICAgICAgICAgICAgLy8gc2Vjb25kIDMyIGJ5dGVzCiAgICAgICAgICAgIHMgOj0gbWxvYWQoYWRkKHNpZywgNjQpKQogICAgICAgICAgICAvLyBmaW5hbCBieXRlIChmaXJzdCBieXRlIG9mIHRoZSBuZXh0IDMyIGJ5dGVzKQogICAgICAgICAgICB2IDo9IGJ5dGUoMCwgbWxvYWQoYWRkKHNpZywgOTYpKSkKICAgICAgICB9CgogICAgICAgIHJldHVybiAodiwgciwgcyk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb3ZlclNpZ25lcihieXRlczMyIG1lc3NhZ2UsIGJ5dGVzIHNpZykKICAgICAgICBpbnRlcm5hbAogICAgICAgIHB1cmUKICAgICAgICByZXR1cm5zIChhZGRyZXNzKQogICAgewogICAgICAgIHVpbnQ4IHY7CiAgICAgICAgYnl0ZXMzMiByOwogICAgICAgIGJ5dGVzMzIgczsKCiAgICAgICAgKHYsIHIsIHMpID0gc3BsaXRTaWduYXR1cmUoc2lnKTsKCiAgICAgICAgcmV0dXJuIGVjcmVjb3ZlcihtZXNzYWdlLCB2LCByLCBzKTsKICAgIH0KCiAgICAvLyBCdWlsZHMgYSBwcmVmaXhlZCBoYXNoIHRvIG1pbWljIHRoZSBiZWhhdmlvciBvZiBldGhfc2lnbi4KICAgIGZ1bmN0aW9uIHByZWZpeGVkKGJ5dGVzMzIgaGFzaCkgaW50ZXJuYWwgcHVyZSByZXR1cm5zIChieXRlczMyKSB7CiAgICAgICAgcmV0dXJuIGtlY2NhazI1NigiXHgxOUV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOlxuMzIiLCBoYXNoKTsKICAgIH0KfQo=&#34; download=&#39;receiverPays.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ReceiverPays&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Funds are sent at deployment time.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ReceiverPays&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimPayment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;usedNonces&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// This recreates the message that was signed on the client.&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;nonce&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Destroy contract and reclaim leftover funds.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;kill&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;selfdestruct&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;


    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Signature methods&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;65&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;assembly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// first 32 bytes, after the length prefix&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// second 32 bytes&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;64&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt;
            &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// final byte (first byte of the next 32 bytes)&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;mload&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;add&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;96&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)))&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #dc322f&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;recoverSigner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;bytes&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;splitSignature&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sig&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;ecrecover&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Builds a prefixed hash to mimic the behavior of eth_sign.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;prefixed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bytes32&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;keccak256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\x19&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;Ethereum Signed Message:&lt;/span&gt;&lt;span style=&#34;color: #cb4b16&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;32&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;hash&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;MetaMask&amp;rsquo;s UI shows the user the message they&amp;rsquo;re signing, but since here the message is a hash, it will never be meaningful to the user. This is one of the issues that EIP-712 is intended to solve.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;You can find browser builds of &lt;code&gt;ethereumjs-abi&lt;/code&gt; in the &lt;a href=&#34;https://github.com/ethereumjs/browser-builds&#34;&gt;&lt;code&gt;ethereumjs/browser-builds repository&lt;/code&gt;&lt;/a&gt;.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:2&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;Web3.js 1.0.0-beta includes a similar function called &lt;a href=&#34;http://web3js.readthedocs.io/en/1.0/web3-utils.html#soliditysha3&#34;&gt;&lt;code&gt;soliditySha3&lt;/code&gt;&lt;/a&gt;, but at the time of this writing, that version is still unreleased and therefore lacking in compatibility with other tools, including MetaMask.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:3&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing A Robust Dividend Token Contract</title>
      <link>https://programtheblockchain.com/posts/2018/02/13/writing-a-robust-dividend-token-contract/</link>
      <pubDate>Tue, 13 Feb 2018 13:29:03 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/13/writing-a-robust-dividend-token-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/07/writing-a-simple-dividend-token-contract/&#34;&gt;simple dividend token post&lt;/a&gt;
made one big simplifying assumption&amp;mdash;it assumed that there were few token units compared to the number of wei in a typical dividend deposit.  This assumption meant that the contract could ignore the fact that integer divisions could result in some wei being forever wasted.  This post will demonstrate how to write an ERC20-compliant token contract that is robust to that problem.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;floating-point-scaling&#34;&gt;Floating-point Scaling&lt;/h2&gt;

&lt;p&gt;Ether values are typically expressed in wei, which means they are really huge numbers.  (Recall that there are 10&lt;sup&gt;18&lt;/sup&gt; wei/ether.)  ERC20 contracts typically use similarly scaled representations of token amounts, with 10&lt;sup&gt;decimals&lt;/sup&gt; units/token.  Operating on scaled values represents a challenge when doing division because all Solidity divisions are integer divisions.  (Recall that the previous simple dividend token restricted &lt;code&gt;decimals&lt;/code&gt; to zero to avoid significant problems due to integer division.)&lt;/p&gt;

&lt;p&gt;If a contract needs to calculate the wei/unit of a particular dividend, it would be natural to just divide the dividend (in wei) by the total supply of tokens (in units).  Unfortunately, this could create a problem if the division yielded a large remainder that would effectively be lost.  For instance, suppose a dividend of 1 ether were to be divided amongst 1,000,000 tokens with &lt;code&gt;decimals&lt;/code&gt;=18.  Doing this directly would imply dividing 10&lt;sup&gt;18&lt;/sup&gt; wei by 10&lt;sup&gt;24&lt;/sup&gt; token units.  This integer division would result in 0 wei/unit.  The division would yield a remainder of 1 ether that would be lost if precautions aren&amp;rsquo;t taken.&lt;/p&gt;

&lt;p&gt;To avoid this lost remainder problem, my robust dividend contract will do two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The contract will scale the wei values up sufficiently to make division problems much less significant.&lt;/li&gt;
&lt;li&gt;The contract will keep track of any remainders and add them back into subsequent computations whenever possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;scaling-values&#34;&gt;Scaling Values&lt;/h2&gt;

&lt;p&gt;Fortunately, 256-bit integers provide lots of room for scaling up wei values.  2&lt;sup&gt;256&lt;/sup&gt; is approximately 10&lt;sup&gt;77&lt;/sup&gt;.  18 of those 77 zeros are used to represent one ether, so we still have 59 zeros of scaling left.&lt;/p&gt;

&lt;p&gt;To keep this contract simple, I will hardwire a scaling of 10&lt;sup&gt;8&lt;/sup&gt;.  I chose 10&lt;sup&gt;8&lt;/sup&gt; because there are 10&lt;sup&gt;6&lt;/sup&gt; tokens for a total of 10&lt;sup&gt;24&lt;/sup&gt; token units.  With a scaling factor of 10&lt;sup&gt;8&lt;/sup&gt;, dividing the total supply of token units into 0.01 ether will result in 1 scaled wei/unit to be distributed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This contract will simply use scaled values in place of the unscaled values in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/07/writing-a-simple-dividend-token-contract/&#34;&gt;simple dividend token&lt;/a&gt;.
So, I&amp;rsquo;ve changed variable names to include the &lt;code&gt;scaled&lt;/code&gt; prefix as appropriate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendCreditedPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Other than being scaled, those values are identical to the similarly-named values in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/07/writing-a-simple-dividend-token-contract/&#34;&gt;simple dividend token contract&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;deposit-and-withdrawal&#34;&gt;Deposit and Withdrawal&lt;/h2&gt;

&lt;p&gt;Deposits and withdrawals need to convert to and from scaled values.  They also need to handle the fact that integer division can leave a remainder&amp;mdash;the contract should track those remainders so that they are not lost.&lt;/p&gt;

&lt;p&gt;Withdrawal simply needs to update the amount of dividend owed, retain any remainder from the scaling division, and then transfer the amount:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;%=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// retain the remainder&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The deposit function computes the scaled wei/unit to distribute and add it to the global &lt;code&gt;scaledDividendPerToken&lt;/code&gt;.  That computation must take into account any previously undistributed (scaled) wei, and it must update that quantity as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledRemainder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// scale the deposit and add the previous remainder&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;available&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledRemainder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;available&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// compute the new remainder&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;scaledRemainder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;available&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Floating-point division requires careful planning to avoid too much loss of precision.&lt;/li&gt;
&lt;li&gt;Floating-point division requires careful attention to any remainders that may get lost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-whole-contract&#34;&gt;The Whole Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;robustDividend.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBSb2J1c3REaXZpZGVuZFRva2VuIHsKCiAgICBzdHJpbmcgcHVibGljIG5hbWUgPSAiUm9idXN0IERpdmlkZW5kIFRva2VuIjsKICAgIHN0cmluZyBwdWJsaWMgc3ltYm9sID0gIkRJViI7CiAgICB1aW50OCBwdWJsaWMgZGVjaW1hbHMgPSAxODsKCiAgICB1aW50MjU2IHB1YmxpYyB0b3RhbFN1cHBseSA9IDEwMDAwMDAgKiAodWludDI1NigxMCkgKiogZGVjaW1hbHMpOwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgYmFsYW5jZU9mOwoKICAgIGZ1bmN0aW9uIFJvYnVzdERpdmlkZW5kVG9rZW4oKSBwdWJsaWMgewogICAgICAgIC8vIEluaXRpYWxseSBhc3NpZ24gYWxsIHRva2VucyB0byB0aGUgY29udHJhY3QncyBjcmVhdG9yLgogICAgICAgIGJhbGFuY2VPZlttc2cuc2VuZGVyXSA9IHRvdGFsU3VwcGx5OwogICAgICAgIGVtaXQgVHJhbnNmZXIoYWRkcmVzcygwKSwgbXNnLnNlbmRlciwgdG90YWxTdXBwbHkpOwogICAgfQoKICAgIHVpbnQyNTYgcHVibGljIHNjYWxpbmcgPSB1aW50MjU2KDEwKSAqKiA4OwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgc2NhbGVkRGl2aWRlbmRCYWxhbmNlT2Y7CgogICAgdWludDI1NiBwdWJsaWMgc2NhbGVkRGl2aWRlbmRQZXJUb2tlbjsKCiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gdWludDI1NikgcHVibGljIHNjYWxlZERpdmlkZW5kQ3JlZGl0ZWRUbzsKCiAgICBmdW5jdGlvbiB1cGRhdGUoYWRkcmVzcyBhY2NvdW50KSBpbnRlcm5hbCB7CiAgICAgICAgdWludDI1NiBvd2VkID0KICAgICAgICAgICAgc2NhbGVkRGl2aWRlbmRQZXJUb2tlbiAtIHNjYWxlZERpdmlkZW5kQ3JlZGl0ZWRUb1thY2NvdW50XTsKICAgICAgICBzY2FsZWREaXZpZGVuZEJhbGFuY2VPZlthY2NvdW50XSArPSBiYWxhbmNlT2ZbYWNjb3VudF0gKiBvd2VkOwogICAgICAgIHNjYWxlZERpdmlkZW5kQ3JlZGl0ZWRUb1thY2NvdW50XSA9IHNjYWxlZERpdmlkZW5kUGVyVG9rZW47CiAgICB9CgogICAgZXZlbnQgVHJhbnNmZXIoYWRkcmVzcyBpbmRleGVkIGZyb20sIGFkZHJlc3MgaW5kZXhlZCB0bywgdWludDI1NiB2YWx1ZSk7CiAgICBldmVudCBBcHByb3ZhbChhZGRyZXNzIGluZGV4ZWQgb3duZXIsIGFkZHJlc3MgaW5kZXhlZCBzcGVuZGVyLCB1aW50MjU2IHZhbHVlKTsKCiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gbWFwcGluZyhhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpKSBwdWJsaWMgYWxsb3dhbmNlOwoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyKGFkZHJlc3MgdG8sIHVpbnQyNTYgdmFsdWUpIHB1YmxpYyByZXR1cm5zIChib29sIHN1Y2Nlc3MpIHsKICAgICAgICByZXF1aXJlKGJhbGFuY2VPZlttc2cuc2VuZGVyXSA&amp;#43;PSB2YWx1ZSk7CgogICAgICAgIHVwZGF0ZShtc2cuc2VuZGVyKTsKICAgICAgICB1cGRhdGUodG8pOwoKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gLT0gdmFsdWU7CiAgICAgICAgYmFsYW5jZU9mW3RvXSArPSB2YWx1ZTsKCiAgICAgICAgZW1pdCBUcmFuc2Zlcihtc2cuc2VuZGVyLCB0bywgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyRnJvbShhZGRyZXNzIGZyb20sIGFkZHJlc3MgdG8sIHVpbnQyNTYgdmFsdWUpCiAgICAgICAgcHVibGljCiAgICAgICAgcmV0dXJucyAoYm9vbCBzdWNjZXNzKQogICAgewogICAgICAgIHJlcXVpcmUodmFsdWUgPD0gYmFsYW5jZU9mW2Zyb21dKTsKICAgICAgICByZXF1aXJlKHZhbHVlIDw9IGFsbG93YW5jZVtmcm9tXVttc2cuc2VuZGVyXSk7CgogICAgICAgIHVwZGF0ZShmcm9tKTsKICAgICAgICB1cGRhdGUodG8pOwoKICAgICAgICBiYWxhbmNlT2ZbZnJvbV0gLT0gdmFsdWU7CiAgICAgICAgYmFsYW5jZU9mW3RvXSArPSB2YWx1ZTsKICAgICAgICBhbGxvd2FuY2VbZnJvbV1bbXNnLnNlbmRlcl0gLT0gdmFsdWU7CiAgICAgICAgZW1pdCBUcmFuc2Zlcihmcm9tLCB0bywgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHVpbnQyNTYgcHVibGljIHNjYWxlZFJlbWFpbmRlciA9IDA7CgogICAgZnVuY3Rpb24gZGVwb3NpdCgpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICAvLyBzY2FsZSB0aGUgZGVwb3NpdCBhbmQgYWRkIHRoZSBwcmV2aW91cyByZW1haW5kZXIKICAgICAgICB1aW50MjU2IGF2YWlsYWJsZSA9IChtc2cudmFsdWUgKiBzY2FsaW5nKSArIHNjYWxlZFJlbWFpbmRlcjsKCiAgICAgICAgc2NhbGVkRGl2aWRlbmRQZXJUb2tlbiArPSBhdmFpbGFibGUgLyB0b3RhbFN1cHBseTsKCiAgICAgICAgLy8gY29tcHV0ZSB0aGUgbmV3IHJlbWFpbmRlcgogICAgICAgIHNjYWxlZFJlbWFpbmRlciA9IGF2YWlsYWJsZSAlIHRvdGFsU3VwcGx5OwogICAgfQoKICAgIGZ1bmN0aW9uIHdpdGhkcmF3KCkgcHVibGljIHsKICAgICAgICB1cGRhdGUobXNnLnNlbmRlcik7CiAgICAgICAgdWludDI1NiBhbW91bnQgPSBzY2FsZWREaXZpZGVuZEJhbGFuY2VPZlttc2cuc2VuZGVyXSAvIHNjYWxpbmc7CiAgICAgICAgc2NhbGVkRGl2aWRlbmRCYWxhbmNlT2ZbbXNnLnNlbmRlcl0gJT0gc2NhbGluZzsgIC8vIHJldGFpbiB0aGUgcmVtYWluZGVyCiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhbW91bnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcHJvdmUoYWRkcmVzcyBzcGVuZGVyLCB1aW50MjU2IHZhbHVlKQogICAgICAgIHB1YmxpYwogICAgICAgIHJldHVybnMgKGJvb2wgc3VjY2VzcykKICAgIHsKICAgICAgICBhbGxvd2FuY2VbbXNnLnNlbmRlcl1bc3BlbmRlcl0gPSB2YWx1ZTsKICAgICAgICBlbWl0IEFwcHJvdmFsKG1zZy5zZW5kZXIsIHNwZW5kZXIsIHZhbHVlKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCn0K&#34; download=&#39;robustDividend.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;RobustDividendToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Robust Dividend Token&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;DIV&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1000000&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;RobustDividendToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Initially assign all tokens to the contract&amp;#39;s creator.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owed&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledRemainder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// scale the deposit and add the previous remainder&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;available&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledRemainder&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;available&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// compute the new remainder&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;scaledRemainder&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;available&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;scaledDividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;%=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaling&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// retain the remainder&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>End to End: Initial Coin Offering</title>
      <link>https://programtheblockchain.com/posts/2018/02/09/end-to-end-initial-coin-offering/</link>
      <pubDate>Fri, 09 Feb 2018 12:10:47 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/09/end-to-end-initial-coin-offering/</guid>
      <description>&lt;p&gt;In this post, I&amp;rsquo;ll walk through the end-to-end process of deploying a new ERC20-compatible token, a token sale contract to sell it, and a website to help users buy the token.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This post will tie together many concepts from earlier posts. I will link to those posts throughout. If you would like to see the running ICO example, you can &lt;a href=&#34;https://programtheblockchain.com/dapps/ico/&#34;&gt;check it out here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;

&lt;p&gt;An initial coin offering (ICO) can be structured in a number of ways. Here, I&amp;rsquo;ll focus on the common scenario of selling a limited supply of an &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/26/what-is-an-ethereum-token/&#34;&gt;Ethereum-based token&lt;/a&gt; via a website for a fixed price.&lt;/p&gt;

&lt;p&gt;This kind of ICO can be decomposed into three components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An ERC20-compatible token that is to be sold.&lt;/li&gt;
&lt;li&gt;A token sale contract that will exchanges tokens for ether.&lt;/li&gt;
&lt;li&gt;A front-end website that displays the progress of the ICO and allows users to make purchases.&lt;/li&gt;
&lt;/ol&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/images/ico-anatomy.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/ico-anatomy.png&#34; width=&#34;75%&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;h2 id=&#34;deploying-the-smart-contracts&#34;&gt;Deploying the Smart Contracts&lt;/h2&gt;

&lt;p&gt;For the ERC20-compatible token, I&amp;rsquo;m using the &lt;code&gt;SimpleERC20Token&lt;/code&gt; contract from our post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;&amp;ldquo;Writing an ERC20 Token Contract&amp;rdquo;&lt;/a&gt;. To sell the token, I&amp;rsquo;m using the &lt;code&gt;TokenSale&lt;/code&gt; contract from our post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/&#34;&gt;&amp;ldquo;Writing a Token Sale Contract&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As described in our post &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/19/testing-and-deploying-smart-contracts-with-remix/&#34;&gt;&amp;ldquo;Testing and Deploying Smart Contracts with Remix&amp;rdquo;&lt;/a&gt;, I used Remix and MetaMask to take the following steps on the Ropsten test network:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy the &lt;code&gt;SimpleERC20Token&lt;/code&gt; contract. At this point, my account owns the total supply of tokens.&lt;/li&gt;
&lt;li&gt;Deploy the &lt;code&gt;TokenSale&lt;/code&gt; contract, supplying the constructor arguments &lt;code&gt;&amp;quot;0x&amp;lt;address of SimpleERCToken&amp;gt;&amp;quot;, 100000000000000&lt;/code&gt;. The latter is the price of each token: 0.0001 ether expressed in wei.&lt;/li&gt;
&lt;li&gt;Transfer tokens from my account to &lt;code&gt;TokenSale&lt;/code&gt; by calling &lt;code&gt;transfer&lt;/code&gt; with the arguments &lt;code&gt;&amp;quot;0x&amp;lt;address of TokenSale&amp;gt;&amp;quot;, 1000000000000000000000000&lt;/code&gt;. The latter is the total supply of tokens: 1,000,000 multiplied by 10&lt;sup&gt;18&lt;/sup&gt; because the token uses 18 decimal places.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;publishing-the-contract-source-code&#34;&gt;Publishing the Contract Source Code&lt;/h2&gt;

&lt;p&gt;As described in our post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/&#34;&gt;&amp;ldquo;Verifying Contract Source Code&amp;rdquo;&lt;/a&gt;, it&amp;rsquo;s important to publish verifiable source code for smart contracts. Following this process, I published source code for both smart contracts on Etherscan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ropsten.etherscan.io/address/0xe1e545c89f3996cf06e1f12c6d05e3412c7c7b11&#34;&gt;ERC20 token contract&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ropsten.etherscan.io/address/0x635a615769f044eaba81f7ae9797d9901a5b09e5&#34;&gt;Token sale contract&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;building-the-user-interface&#34;&gt;Building the User Interface&lt;/h2&gt;

&lt;p&gt;With the two contracts deployed and the source code published, anyone can buy tokens by using a tool like &lt;a href=&#34;https://myetherwallet.com&#34;&gt;MyEtherWallet&lt;/a&gt; or by writing code. This is, however, a very inconvenient way to interact with a smart contract. In our post &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/&#34;&gt;&amp;ldquo;Building Decentralized Apps With Ethereum and JavaScript&amp;rdquo;&lt;/a&gt;, I described how web-based UI can help users work with smart contracts. If you haven&amp;rsquo;t already read that post, I strongly suggest doing so now, as the rest of this post will lean heavily on that material.&lt;/p&gt;


&lt;figure class=&#34;pa2 shadow-4&#34;&gt;
    &lt;a href=&#34;https://programtheblockchain.com/images/ico-screenshot.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/ico-screenshot.png&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;h3 id=&#34;buying-tokens&#34;&gt;Buying Tokens&lt;/h3&gt;

&lt;p&gt;The most important piece of functionality in an ICO interface is the ability to buy tokens. In the UI I designed, this consists of a text box where the user can enter a number of tokens to buy and a button labeled &amp;ldquo;Buy Tokens.&amp;rdquo; When the button is pressed, the following code is executed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#buyForm&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).submit(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(e)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Prevent the browser from POSTing the form.&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;e.preventDefault();&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;numberOfTokens&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.toBigNumber($(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#number&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).val());&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;saleContract.buyTokens.sendTransaction(numberOfTokens,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;value:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;numberOfTokens.mul(price),&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Nothing to do here. If the transaction is successful, it will trigger&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// events that we&amp;#39;re already monitoring.&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are two things to note in the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As a best practice, I try to always represent numbers as &lt;code&gt;BigNumber&lt;/code&gt;s. This is how values from the blockchain are returned, and it protects against JavaScript&amp;rsquo;s &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER&#34;&gt;limitations around number values&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The result of sending the transaction is ignored. As I&amp;rsquo;ll explain later in this post, UI updates are triggered by events, and a successful transaction will log such an event. A failed transaction requires no UI update.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;displaying-information&#34;&gt;Displaying Information&lt;/h3&gt;

&lt;p&gt;In addition to purchasing tokens, a good ICO interface will also show information about the state of the token sale as well as the user&amp;rsquo;s token balance. My example interface displays the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The user&amp;rsquo;s current balance. This is provided by the token contract&amp;rsquo;s &lt;code&gt;balanceOf&lt;/code&gt; function, passing the user&amp;rsquo;s account as the sole argument.&lt;/li&gt;
&lt;li&gt;The number of tokens remaining to be sold. This is again provided by the token contract&amp;rsquo;s &lt;code&gt;balanceOf&lt;/code&gt; function, this time passing in the sale contract&amp;rsquo;s address.&lt;/li&gt;
&lt;li&gt;The number of tokens that have already been sold. This is provided by the sale contract&amp;rsquo;s &lt;code&gt;tokensSold&lt;/code&gt; function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This function collects all the required data:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;loadData(blockNumber)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Loading data from contracts...&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;balance,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;sold,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;remaining;&lt;/span&gt;

  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Callback that waits for all three pieces of data before proceeding&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;updateWhenDone()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;undefined&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;sold&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;undefined&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;remaining&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;undefined&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Updating UI.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;updateUI(balance.div(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**decimals),&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;sold,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;remaining.div(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;**decimals));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Fetch in parallel&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// User&amp;#39;s balance&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;tokenContract.balanceOf.call(web3.eth.defaultAccount,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{},&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;blockNumber,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;_balance)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;_balance;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;updateWhenDone();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Tokens sold so far&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;saleContract.tokensSold.call({},&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;blockNumber,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;_sold)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;sold&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;_sold;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;updateWhenDone();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Remaining inventory (sale contract&amp;#39;s balance)&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;tokenContract.balanceOf.call(saleAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{},&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;blockNumber,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;_remaining)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;remaining&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;_remaining;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;updateWhenDone();&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each &lt;code&gt;call&lt;/code&gt; specifies a block number. By default, a &lt;code&gt;call&lt;/code&gt; uses state from the latest block. When fetching multiple pieces of data, specifying a particular block number ensures that all the data comes from the same point in time.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;call&lt;/code&gt;s to the blockchain are issued in parallel. All of them invoke the same callback, which waits until all of the data has been collected before it calls &lt;code&gt;updateUI&lt;/code&gt;. Just as with the previous point, updating the UI all at once helps to make sure users never see mismatched data from multiple blocks.&lt;/li&gt;
&lt;li&gt;Because token amounts are scaled according to the number of decimals a token uses, it&amp;rsquo;s important to divide by 10&lt;sup&gt;decimals&lt;/sup&gt; before displaying a number to a user.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;watching-for-changes&#34;&gt;Watching for Changes&lt;/h3&gt;

&lt;p&gt;The information displayed by the ICO can change for a number of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transferring tokens into the token sale contract increases the number of available tokens for sale.&lt;/li&gt;
&lt;li&gt;Someone buying tokens increases the number of tokens sold so far and decreases the number of tokens remaining for sale.&lt;/li&gt;
&lt;li&gt;Unrelated transfers in and out of the user&amp;rsquo;s account change the account&amp;rsquo;s token balance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UI is kept up to date by watching events, as described in our post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/24/logging-and-watching-solidity-events/&#34;&gt;&amp;ldquo;Logging and Watching Solidity Events&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;initialize()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.getBlockNumber(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;lastSeenBlock)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Load data for the initial block&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;loadData(lastSeenBlock);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Handler for events that necessitate a UI update&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;changeHandler(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;data)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;

      &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Only if we haven&amp;#39;t already fetched data for this block&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(data.blockNumber&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;lastSeenBlock)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;lastSeenBlock&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;data.blockNumber;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;loadData(lastSeenBlock);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The Sold event tells us when the number of sold tokens changes.&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;saleContract.Sold(changeHandler);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// We display the user&amp;#39;s balance as well as the sale contract&amp;#39;s&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// balance, so we need to monitor transfers to both.&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;tokenContract.Transfer({&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;to:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;saleAddress,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;changeHandler);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// To display an accurate balance, we also need to monitor transfers out&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// of the user&amp;#39;s account.&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;tokenContract.Transfer({&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;from:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;changeHandler);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This code is executed once on page load.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web3.eth.getBlockNumber&lt;/code&gt; is used to find the latest block number. Data is loaded from that block.&lt;/li&gt;
&lt;li&gt;New data is only loaded if an event occurs in a block that hasn&amp;rsquo;t been seen yet. This is tracked in the &lt;code&gt;lastSeenBlock&lt;/code&gt; variable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Transfer&lt;/code&gt; events have indexed parameters, so they can be efficiently filtered.  An array as a filter value means a logical &amp;ldquo;or,&amp;rdquo; so the first &lt;code&gt;Transfer&lt;/code&gt; filter will match any &lt;code&gt;Transfer&lt;/code&gt; event that has a &lt;code&gt;to&lt;/code&gt; argument of the sale address &lt;strong&gt;or&lt;/strong&gt; the user&amp;rsquo;s account.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;handling-account-switches&#34;&gt;Handling Account Switches&lt;/h3&gt;

&lt;p&gt;Neither MetaMask nor &lt;code&gt;web3.js&lt;/code&gt; provide an easy way to respond to the user switching accounts, but it can be important to do so. In this ICO example, information on the page pertains to a specific account, and it is updated in response to events targeting that account. If the user switches to use a different account, the UI should update accordingly.&lt;/p&gt;

&lt;p&gt;The following code handles this situation in the ICO example app:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;initialAccount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.defaultAccount;&lt;/span&gt;
&lt;span style=&#34;color: #268bd2&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.setInterval(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(web3.eth.defaultAccount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;initialAccount)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.location.reload();&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;500&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code checks which account is active every 500 milliseconds. If the active account changes, it simply reloads the page. A more sophisticated approach would be to reset the UI and stop all event listeners, but here the simple approach suffices.&lt;/p&gt;

&lt;h2 id=&#34;try-the-demo&#34;&gt;Try the Demo&lt;/h2&gt;

&lt;p&gt;You can &lt;a href=&#34;https://programtheblockchain.com/dapps/ico/&#34;&gt;try the demo here&lt;/a&gt;. You&amp;rsquo;ll need MetaMask (or something else that injects &lt;code&gt;web3.js&lt;/code&gt;) and an account with funds on the Ropsten test network. If you&amp;rsquo;d like to see the full source code for the front end, view the source of that page.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An initial coin offering typically uses two smart contracts: an ERC20-compatible token and a token sale contract.&lt;/li&gt;
&lt;li&gt;Like all DApps, an ICO app has a front end written in HTML and JavaScript that uses &lt;code&gt;web3.js&lt;/code&gt; to make calls to the blockchain.&lt;/li&gt;
&lt;li&gt;When displaying multiple, connected pieces of data, care should be taken to retrieve all data from the same block and to update the UI atomically.&lt;/li&gt;
&lt;li&gt;To avoid repeated work, multiple events triggered in the same block can be consolidated into a single data fetch.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Writing A Simple Dividend Token Contract</title>
      <link>https://programtheblockchain.com/posts/2018/02/07/writing-a-simple-dividend-token-contract/</link>
      <pubDate>Wed, 07 Feb 2018 05:49:29 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/07/writing-a-simple-dividend-token-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tokens can provide rights or privileges to their owners.  One of the most natural is the right to share proportionally in an income stream.  This post will demonstrate how to write an ERC20-compliant contract that can divide ether dividends proportionally amongst token owners. This post combines ideas from our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;ERC20 token post&lt;/a&gt;,
and our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;banking post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This post will ignore some complications that arise from the lack of support for fixed-point numbers in the Ethereum Virtual Machine.  (Specifically, I will assume that &lt;code&gt;decimals==0&lt;/code&gt; in the token contract.)  I will address those issues in a future post.&lt;/p&gt;

&lt;h2 id=&#34;smart-contract-limitations&#34;&gt;Smart Contract Limitations&lt;/h2&gt;

&lt;p&gt;A recurring challenge in smart contract development is the high gas cost of iteration. This challenge is apparent when it comes to paying dividends. When a dividend is deposited, it must be evenly distributed among all token owners. However, there may be millions of token owners, and iterating over all of them would be tremendously expensive. Because such iteration is infeasible, contracts often need to defer such computation until it can be done on a per-item basis.&lt;/p&gt;

&lt;p&gt;To that end, the contract will track the status of dividends owed to each account.  Dividends associated with a particular account will always be in one of three states:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Already paid/transferred to the account.&lt;/li&gt;
&lt;li&gt;Already credited to the account, but not yet transferred.&lt;/li&gt;
&lt;li&gt;Not yet credited to the account, but the contract has sufficient information to compute the credit when needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All new dividends owed to an account start in the &amp;ldquo;not yet credited&amp;rdquo; state.  Once that account is part of a transfer or withdrawal, the contract will compute the amount owed and credit it to the account, which moves the amount to the &amp;ldquo;credited but not transferred&amp;rdquo; status.  Actual withdrawals move those credits to the final &amp;ldquo;transferred&amp;rdquo; state.&lt;/p&gt;

&lt;p&gt;The contract will use the following values to determine the remaining amount due to each token owner:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dividendPerToken&lt;/code&gt; is the cumulative amount of ether per token that has been deposited in this contract.  For instance, if there are 100 tokens, and the contract had collected 200 ether since its creation, then &lt;code&gt;dividendPerToken&lt;/code&gt; would represent 2 ether per token.  Note that this value is never decreased and is completely independent of any withdrawals made by token owners.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dividendBalanceOf&lt;/code&gt; is a mapping that represents the amount of ether credited to each account but not yet transferred to that account.  Withdrawals reduce this amount.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dividendCreditedPerToken&lt;/code&gt; is a mapping that represents the cumulative amount of ether per token that has been previously credited to the account (i.e. added to &lt;code&gt;dividendBalanceOf&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These three values track the three states of dividend payments to each account, and all values are stored in wei.&lt;/p&gt;

&lt;h2 id=&#34;augmenting-the-simple-erc20-token-contract&#34;&gt;Augmenting the Simple ERC20 Token Contract&lt;/h2&gt;

&lt;p&gt;The
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;simple ERC20 token contract&lt;/a&gt; requires a few changes to support dividends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The functions that transfer tokens must be augmented to update the amounts owed to each account.  The contract will do this by updating the account&amp;rsquo;s &lt;code&gt;dividendCreditedPerToken&lt;/code&gt; and &lt;code&gt;dividendBalanceOf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The contract must accept dividend deposits, and per-account withdrawals.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;transfer-functions&#34;&gt;Transfer Functions&lt;/h2&gt;

&lt;p&gt;Any token transfer must update the per-account &lt;code&gt;dividendCreditedTo&lt;/code&gt; and &lt;code&gt;dividendBalanceOf&lt;/code&gt; values.  The &lt;code&gt;dividendCreditedTo&lt;/code&gt; will be adjusted to the current (global) &lt;code&gt;dividendPerToken&lt;/code&gt; value.  That change represents the value that needs to be credited to &lt;code&gt;dividendBalanceOf&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owed&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;dividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This update function gets an account&amp;rsquo;s values up to date with respect to any dividends that were received since the last time the account was accessed.  After that, the contract simply needs to update both the sender and receiver&amp;rsquo;s per-account balances in the transfer functions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;deposit-and-withdrawal&#34;&gt;Deposit and Withdrawal&lt;/h2&gt;

&lt;p&gt;The deposit function accepts ether and updates the global &lt;code&gt;dividendPerToken&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ignoring the remainder&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If &lt;code&gt;msg.value / totalSupply&lt;/code&gt; produces a remainder, then ether is lost forever.  We will address this deficiency in a future post.&lt;/p&gt;

&lt;p&gt;Withdrawal simply needs to update the the dividend owed, and then transfer it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Two things to note above:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;update(msg.sender)&lt;/code&gt; is responsible for making sure &lt;code&gt;dividendBalanceOf&lt;/code&gt; is up to date with respect to any dividends collected since the last update to &lt;code&gt;msg.sender&lt;/code&gt;&amp;rsquo;s balances.&lt;/li&gt;
&lt;li&gt;As we&amp;rsquo;ve described &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;before&lt;/a&gt;, it&amp;rsquo;s essential to zero out &lt;code&gt;dividendBalanceOf&lt;/code&gt; &lt;strong&gt;before&lt;/strong&gt; doing the transfer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ERC20 token contracts can distribute dividends proportional to token ownership.&lt;/li&gt;
&lt;li&gt;Smart contracts that need to update per-account values across &lt;em&gt;all&lt;/em&gt; accounts need to do so in a deferred, as-needed way to avoid iterating over all accounts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-whole-contract&#34;&gt;The Whole Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;simpleDividend.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBTaW1wbGVEaXZpZGVuZFRva2VuIHsKCiAgICBzdHJpbmcgcHVibGljIG5hbWUgPSAiU2ltcGxlIERpdmlkZW5kIFRva2VuIjsKICAgIHN0cmluZyBwdWJsaWMgc3ltYm9sID0gIlNESVYiOwoKICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIGRlY2ltYWxzIGlzIHplcm8tLS1kbyBub3QgY2hhbmdlLgogICAgdWludDggcHVibGljIGRlY2ltYWxzID0gMDsgICAvLyAgRE8gTk9UIENIQU5HRSEKCiAgICB1aW50MjU2IHB1YmxpYyB0b3RhbFN1cHBseSA9IDEwMDAwMDAgKiAodWludDI1NigxMCkgKiogZGVjaW1hbHMpOwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgYmFsYW5jZU9mOwoKICAgIGZ1bmN0aW9uIFNpbXBsZURpdmlkZW5kVG9rZW4oKSBwdWJsaWMgewogICAgICAgIC8vIEluaXRpYWxseSBhc3NpZ24gYWxsIHRva2VucyB0byB0aGUgY29udHJhY3QncyBjcmVhdG9yLgogICAgICAgIGJhbGFuY2VPZlttc2cuc2VuZGVyXSA9IHRvdGFsU3VwcGx5OwogICAgICAgIGVtaXQgVHJhbnNmZXIoYWRkcmVzcygwKSwgbXNnLnNlbmRlciwgdG90YWxTdXBwbHkpOwogICAgfQoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBkaXZpZGVuZEJhbGFuY2VPZjsKCiAgICB1aW50MjU2IHB1YmxpYyBkaXZpZGVuZFBlclRva2VuOwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSBkaXZpZGVuZENyZWRpdGVkVG87CgogICAgZnVuY3Rpb24gdXBkYXRlKGFkZHJlc3MgYWNjb3VudCkgaW50ZXJuYWwgewogICAgICAgIHVpbnQyNTYgb3dlZCA9CiAgICAgICAgICAgIGRpdmlkZW5kUGVyVG9rZW4gLSBkaXZpZGVuZENyZWRpdGVkVG9bYWNjb3VudF07CiAgICAgICAgZGl2aWRlbmRCYWxhbmNlT2ZbYWNjb3VudF0gKz0gYmFsYW5jZU9mW2FjY291bnRdICogb3dlZDsKICAgICAgICBkaXZpZGVuZENyZWRpdGVkVG9bYWNjb3VudF0gPSBkaXZpZGVuZFBlclRva2VuOwogICAgfQoKICAgIGV2ZW50IFRyYW5zZmVyKGFkZHJlc3MgaW5kZXhlZCBmcm9tLCBhZGRyZXNzIGluZGV4ZWQgdG8sIHVpbnQyNTYgdmFsdWUpOwogICAgZXZlbnQgQXBwcm92YWwoYWRkcmVzcyBpbmRleGVkIG93bmVyLCBhZGRyZXNzIGluZGV4ZWQgc3BlbmRlciwgdWludDI1NiB2YWx1ZSk7CgogICAgbWFwcGluZyhhZGRyZXNzID0&amp;#43;IG1hcHBpbmcoYWRkcmVzcyA9PiB1aW50MjU2KSkgcHVibGljIGFsbG93YW5jZTsKCiAgICBmdW5jdGlvbiB0cmFuc2ZlcihhZGRyZXNzIHRvLCB1aW50MjU2IHZhbHVlKSBwdWJsaWMgcmV0dXJucyAoYm9vbCBzdWNjZXNzKSB7CiAgICAgICAgcmVxdWlyZShiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPj0gdmFsdWUpOwoKICAgICAgICB1cGRhdGUobXNnLnNlbmRlcik7ICAvLyA8LS0gYWRkZWQgdG8gc2ltcGxlIEVSQzIwIGNvbnRyYWN0CiAgICAgICAgdXBkYXRlKHRvKTsgICAgICAgICAgLy8gPC0tIGFkZGVkIHRvIHNpbXBsZSBFUkMyMCBjb250cmFjdAoKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gLT0gdmFsdWU7CiAgICAgICAgYmFsYW5jZU9mW3RvXSArPSB2YWx1ZTsKCiAgICAgICAgZW1pdCBUcmFuc2Zlcihtc2cuc2VuZGVyLCB0bywgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyRnJvbShhZGRyZXNzIGZyb20sIGFkZHJlc3MgdG8sIHVpbnQyNTYgdmFsdWUpCiAgICAgICAgcHVibGljCiAgICAgICAgcmV0dXJucyAoYm9vbCBzdWNjZXNzKQogICAgewogICAgICAgIHJlcXVpcmUodmFsdWUgPD0gYmFsYW5jZU9mW2Zyb21dKTsKICAgICAgICByZXF1aXJlKHZhbHVlIDw9IGFsbG93YW5jZVtmcm9tXVttc2cuc2VuZGVyXSk7CgogICAgICAgIHVwZGF0ZShmcm9tKTsgICAgICAgIC8vIDwtLSBhZGRlZCB0byBzaW1wbGUgRVJDMjAgY29udHJhY3QKICAgICAgICB1cGRhdGUodG8pOyAgICAgICAgICAvLyA8LS0gYWRkZWQgdG8gc2ltcGxlIEVSQzIwIGNvbnRyYWN0CgogICAgICAgIGJhbGFuY2VPZltmcm9tXSAtPSB2YWx1ZTsKICAgICAgICBiYWxhbmNlT2ZbdG9dICs9IHZhbHVlOwogICAgICAgIGFsbG93YW5jZVtmcm9tXVttc2cuc2VuZGVyXSAtPSB2YWx1ZTsKICAgICAgICBlbWl0IFRyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gZGVwb3NpdCgpIHB1YmxpYyBwYXlhYmxlIHsKICAgICAgICBkaXZpZGVuZFBlclRva2VuICs9IG1zZy52YWx1ZSAvIHRvdGFsU3VwcGx5OyAgLy8gaWdub3JpbmcgcmVtYWluZGVyCiAgICB9CgogICAgZnVuY3Rpb24gd2l0aGRyYXcoKSBwdWJsaWMgewogICAgICAgIHVwZGF0ZShtc2cuc2VuZGVyKTsKICAgICAgICB1aW50MjU2IGFtb3VudCA9IGRpdmlkZW5kQmFsYW5jZU9mW21zZy5zZW5kZXJdOwogICAgICAgIGRpdmlkZW5kQmFsYW5jZU9mW21zZy5zZW5kZXJdID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwcm92ZShhZGRyZXNzIHNwZW5kZXIsIHVpbnQyNTYgdmFsdWUpCiAgICAgICAgcHVibGljCiAgICAgICAgcmV0dXJucyAoYm9vbCBzdWNjZXNzKQogICAgewogICAgICAgIGFsbG93YW5jZVttc2cuc2VuZGVyXVtzcGVuZGVyXSA9IHZhbHVlOwogICAgICAgIGVtaXQgQXBwcm92YWwobXNnLnNlbmRlciwgc3BlbmRlciwgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKfQo=&#34; download=&#39;simpleDividend.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimpleDividendToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Simple Dividend Token&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;SDIV&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// This code assumes decimals is zero---do not change.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;//  DO NOT CHANGE!&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1000000&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimpleDividendToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Initially assign all tokens to the contract&amp;#39;s creator.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owed&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owed&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dividendCreditedTo&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;account&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;-- added to simple ERC20 contract&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dividendPerToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ignoring remainder&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;update&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;dividendBalanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Token Sale Contract</title>
      <link>https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/</link>
      <pubDate>Fri, 02 Feb 2018 12:14:20 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/02/02/writing-a-token-sale-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this post, I&amp;rsquo;ll build a simple smart contract that sells a limited supply of an Ethereum-based token for a fixed price. To understand this post, you&amp;rsquo;ll need to be familiar with &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;ERC20 Tokens&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;interacting-with-other-smart-contracts&#34;&gt;Interacting with Other Smart Contracts&lt;/h2&gt;

&lt;p&gt;The token sale smart contract will accept ether as payment and transfer tokens to the buyer in exchange. The token that will be transferred is implemented in a separate smart contract. To support calling into the token contract, I need to first tell Solidity what functions that contract supports.&lt;/p&gt;

&lt;p&gt;An &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/contracts.html#interfaces&#34;&gt;&lt;code&gt;interface&lt;/code&gt;&lt;/a&gt; in Solidity is similar to the same concept in other programming languages. It describes what functions are available in a contract. The following code defines a minimal &lt;code&gt;interface&lt;/code&gt; for ERC20-compatible tokens. Note that I don&amp;rsquo;t have to declare all the functions an ERC20 token has&amp;mdash;just the ones I&amp;rsquo;m going to use.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I can now cast any address to type &lt;code&gt;IERC20Token&lt;/code&gt; and then call the above functions on it, like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0x123abc&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;...);&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the sale contract, I&amp;rsquo;ll pass the address of the token contract as a constructor parameter rather than hard-code it.&lt;/p&gt;

&lt;h2 id=&#34;supply-and-price&#34;&gt;Supply and Price&lt;/h2&gt;

&lt;p&gt;Although token sales come in many shapes and sizes, in this post I&amp;rsquo;m focusing on a simple fixed-price sale of a limited supply of tokens. The contract needs to know, then, how many tokens it has available for sale and the unit price of each token.&lt;/p&gt;

&lt;p&gt;One of the simplest ways to keep track of the supply is to use the contract&amp;rsquo;s token balance. After deploying the sale contract, I&amp;rsquo;ll call &lt;code&gt;transfer(contractAddress, amountToSell)&lt;/code&gt; on the token contract. Once I&amp;rsquo;ve transferred tokens to it, the sale contract can use &lt;code&gt;tokenContract.balanceOf(this)&lt;/code&gt; to see how many tokens are available to be sold.&lt;/p&gt;

&lt;p&gt;The price needs to be set at deployment time, so in addition to the address of the token contract, I&amp;rsquo;ll add a constructor parameter for the price:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenSale&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the token being sold&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;              &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the price, in wei, per token&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenSale&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Two things to notice in the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I deploy the contract, I&amp;rsquo;ll pass an address as the first argument, and Solidity will cast it for me to type &lt;code&gt;IERC20Token&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m keeping track of the &lt;em&gt;owner&lt;/em&gt; (the account that deployed the contract). The owner account is special in that it will be allowed to end the sale and retrieve the collected ether.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;selling-tokens&#34;&gt;Selling Tokens&lt;/h2&gt;

&lt;p&gt;Now that the contract has tokens to sell and a price at which to sell them, it&amp;rsquo;s time to write the core logic of the contract. It may be helpful to read &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/&#34;&gt;Writing a Contract That Handles Ether&lt;/a&gt; if you haven&amp;rsquo;t already:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokensSold&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Sold&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;safeMultiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;safeMultiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;());&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Sold&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;tokensSold&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To help prevent mistakes, the function accepts as a parameter how many tokens are being purchased and then checks that the correct amount of ether was sent.&lt;/li&gt;
&lt;li&gt;Recall from &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/&#34;&gt;Writing an ERC20 Token Contract&lt;/a&gt; that in order to support fixed point math on tokens, &amp;ldquo;1 token&amp;rdquo; is represented in the token contract as a value of 10^&lt;em&gt;decimals&lt;/em&gt;, where &lt;em&gt;decimals&lt;/em&gt; is how many decimal places after the zero the contract supports. I convert the number of tokens to this scaled number in &lt;code&gt;scaledAmount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;safeMultiply&lt;/code&gt; (defined below) is used to guard against integer overflows if someone maliciously passes in a very high value for &lt;code&gt;numberOfTokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The second &lt;code&gt;require&lt;/code&gt; statement checks to make sure the contract has a sufficient number of tokens to complete the sale.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tokensSold&lt;/code&gt; and the &lt;code&gt;Sold&lt;/code&gt; event are there for UI purposes. They make it easy for a front end application to monitor the progress of the sale.&lt;/li&gt;
&lt;li&gt;Because the ERC20 token standard allows tokens to return &lt;code&gt;false&lt;/code&gt; on failure, rather than reverting, the final &lt;code&gt;require&lt;/code&gt; is necessary to ensure the buyer actually receives their tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;ending-the-sale&#34;&gt;Ending the Sale&lt;/h2&gt;

&lt;p&gt;In this sale contract, the owner will be allowed to end the sale at any time. All unsold tokens will be transferred to the owner, as will all collected ether.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endSale&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Send unsold tokens to the owner.&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)));&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This function transfers all remaining tokens as well as all ether collected. Because the contract holds no more tokens, any subsequent calls to &lt;code&gt;buyTokens&lt;/code&gt; will fail.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Contracts can call functions in other contracts, but to do so they must declare the target contract&amp;rsquo;s &lt;code&gt;interface&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Care must be taken to scale ERC20 token amounts appropriately according to their number of &lt;code&gt;decimals&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;full-source-code&#34;&gt;Full Source Code&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;tokenSale.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7CgppbnRlcmZhY2UgSUVSQzIwVG9rZW4gewogICAgZnVuY3Rpb24gYmFsYW5jZU9mKGFkZHJlc3Mgb3duZXIpIHB1YmxpYyByZXR1cm5zICh1aW50MjU2KTsKICAgIGZ1bmN0aW9uIHRyYW5zZmVyKGFkZHJlc3MgdG8sIHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgcmV0dXJucyAoYm9vbCk7CiAgICBmdW5jdGlvbiBkZWNpbWFscygpIHB1YmxpYyByZXR1cm5zICh1aW50MjU2KTsKfQoKY29udHJhY3QgVG9rZW5TYWxlIHsKICAgIElFUkMyMFRva2VuIHB1YmxpYyB0b2tlbkNvbnRyYWN0OyAgLy8gdGhlIHRva2VuIGJlaW5nIHNvbGQKICAgIHVpbnQyNTYgcHVibGljIHByaWNlOyAgICAgICAgICAgICAgLy8gdGhlIHByaWNlLCBpbiB3ZWksIHBlciB0b2tlbgogICAgYWRkcmVzcyBvd25lcjsKCiAgICB1aW50MjU2IHB1YmxpYyB0b2tlbnNTb2xkOwoKICAgIGV2ZW50IFNvbGQoYWRkcmVzcyBidXllciwgdWludDI1NiBhbW91bnQpOwoKICAgIGZ1bmN0aW9uIFRva2VuU2FsZShJRVJDMjBUb2tlbiBfdG9rZW5Db250cmFjdCwgdWludDI1NiBfcHJpY2UpIHB1YmxpYyB7CiAgICAgICAgb3duZXIgPSBtc2cuc2VuZGVyOwogICAgICAgIHRva2VuQ29udHJhY3QgPSBfdG9rZW5Db250cmFjdDsKICAgICAgICBwcmljZSA9IF9wcmljZTsKICAgIH0KCiAgICAvLyBHdWFyZHMgYWdhaW5zdCBpbnRlZ2VyIG92ZXJmbG93cwogICAgZnVuY3Rpb24gc2FmZU11bHRpcGx5KHVpbnQyNTYgYSwgdWludDI1NiBiKSBpbnRlcm5hbCBwdXJlIHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVpbnQyNTYgYyA9IGEgKiBiOwogICAgICAgICAgICBhc3NlcnQoYyAvIGEgPT0gYik7CiAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBidXlUb2tlbnModWludDI1NiBudW1iZXJPZlRva2VucykgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUobXNnLnZhbHVlID09IHNhZmVNdWx0aXBseShudW1iZXJPZlRva2VucywgcHJpY2UpKTsKCiAgICAgICAgdWludDI1NiBzY2FsZWRBbW91bnQgPSBzYWZlTXVsdGlwbHkobnVtYmVyT2ZUb2tlbnMsCiAgICAgICAgICAgIHVpbnQyNTYoMTApICoqIHRva2VuQ29udHJhY3QuZGVjaW1hbHMoKSk7CgogICAgICAgIHJlcXVpcmUodG9rZW5Db250cmFjdC5iYWxhbmNlT2YodGhpcykgPj0gc2NhbGVkQW1vdW50KTsKCiAgICAgICAgZW1pdCBTb2xkKG1zZy5zZW5kZXIsIG51bWJlck9mVG9rZW5zKTsKICAgICAgICB0b2tlbnNTb2xkICs9IG51bWJlck9mVG9rZW5zOwoKICAgICAgICByZXF1aXJlKHRva2VuQ29udHJhY3QudHJhbnNmZXIobXNnLnNlbmRlciwgc2NhbGVkQW1vdW50KSk7CiAgICB9CgogICAgZnVuY3Rpb24gZW5kU2FsZSgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IG93bmVyKTsKCiAgICAgICAgLy8gU2VuZCB1bnNvbGQgdG9rZW5zIHRvIHRoZSBvd25lci4KICAgICAgICByZXF1aXJlKHRva2VuQ29udHJhY3QudHJhbnNmZXIob3duZXIsIHRva2VuQ29udHJhY3QuYmFsYW5jZU9mKHRoaXMpKSk7CgogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYWRkcmVzcyh0aGlzKS5iYWxhbmNlKTsKICAgIH0KfQoK&#34; download=&#39;tokenSale.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenSale&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the token being sold&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;              &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// the price, in wei, per token&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokensSold&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Sold&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TokenSale&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;IERC20Token&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Guards against integer overflows&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;safeMultiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;pure&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
            &lt;span style=&#34;color: #586e75&#34;&gt;assert&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;buyTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;safeMultiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;price&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledAmount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;safeMultiply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;());&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Sold&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;tokensSold&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfTokens&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;scaledAmount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;endSale&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Send unsold tokens to the owner.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;tokenContract&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)));&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing an ERC20 Token Contract</title>
      <link>https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/</link>
      <pubDate>Tue, 30 Jan 2018 13:33:39 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/30/writing-an-erc20-token-contract/</guid>
      <description>&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post will demonstrate how to write a simple, but complete, smart contract in Solidity that implements the ERC20 token standard. It assumes that you are familiar with concepts introduced in our post,
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/26/what-is-an-ethereum-token/&#34;&gt;What is an Ethereum Token?&lt;/a&gt;,
which discussed how tokens are maintained as per-account balances and how those balances can be transferred between accounts.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The ERC20 token standard enables different tokens to be treated similarly in marketplaces and exchanges.  It also enables contracts that handle tokens to be written once and used across many different tokens.  For instance, the same contract might be able to handle the initial sale of different ERC20 tokens.  This post is going to develop a very simple ERC20-compliant token contract, which (I hope) will help you understand the standard from a code-centric point of view.&lt;/p&gt;

&lt;p&gt;You don&amp;rsquo;t need to be familiar with the
&lt;a href=&#34;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md&#34;&gt;standard&lt;/a&gt;
to understand this post. Like most standards, some things are required and some are optional.  The code below will implement everything, but we&amp;rsquo;ll point out the optional parts.&lt;/p&gt;

&lt;h2 id=&#34;name-and-symbol-optional&#34;&gt;&lt;code&gt;name&lt;/code&gt; and &lt;code&gt;symbol&lt;/code&gt; (optional)&lt;/h2&gt;

&lt;p&gt;ERC20 token contracts may give their tokens a (string) name and a (string) symbol.  Typically, the name is a short description of the token, and the symbol is a one word identifier.  To be compliant, the name and symbol must be accessible via view functions with the following types:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ERC20 optional functions&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To implement those, I will use the Solidity shorthand of simply defining
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/&#34;&gt;public variables&lt;/a&gt;
by the same name with the same type (because Solidity will generate the corresponding getter automatically):&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;totalsupply-required&#34;&gt;&lt;code&gt;totalSupply&lt;/code&gt; (required)&lt;/h2&gt;

&lt;p&gt;ERC20 contracts must provide a similar view function that returns the current number of outstanding tokens.  Again, I will use a public variable because Solidity will create the corresponding public getter:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;fixed-point-math-decimals-optional&#34;&gt;Fixed-point Math: &lt;code&gt;decimals&lt;/code&gt; (optional)&lt;/h2&gt;

&lt;p&gt;Neither the Ethereum Virtual Machine nor Solidity offer support for fixed-point numbers&amp;mdash;they only support various flavors of integers.  This presents a challenge when a contract would like to present others with the idea of a fractional unit.  To do this, it is necessary to simulate fixed-point numbers explicitly.&lt;/p&gt;

&lt;p&gt;This kind of simulation is already done with ether.  When contracts pass around huge 256-bit integers to represent ether transfers, those numbers don&amp;rsquo;t actually directly represent ether&amp;mdash;they represent wei.  Recall that 1 ether equals 10^18 wei.  This means that when a contract is given a uint256 value that represents a single ether, it is not passed the integer 1, it is passed the integer 1,000,000,000,000,000,000.&lt;/p&gt;

&lt;p&gt;Many token contracts support fractional tokens, and they do so in precisely the same way by having a scaling factor.  In ERC20 tokens, that scaling factor is denoted by the value of &lt;code&gt;decimals&lt;/code&gt;, which indicates how many 0&amp;rsquo;s there are to the right of the decimal point the fixed-point representation of a token.&lt;/p&gt;

&lt;p&gt;For instance, a contract that supports &lt;sup&gt;1&lt;/sup&gt;&amp;frasl;&lt;sub&gt;100&lt;/sub&gt;&amp;rsquo;s of tokens (e.g, 3.14, 2.72), would have &lt;code&gt;decimals&lt;/code&gt; equal to 2.  If &lt;code&gt;decimals = 2&lt;/code&gt;, then the value stored to represent 3.14 would be 314.&lt;/p&gt;

&lt;p&gt;ERC20 contracts support this with the optional view public function, &lt;code&gt;decimals&lt;/code&gt;.  Again, a public variable suffices:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Unlike the common use of 256-bit integers in Solidity programs, this only requires 8 bits because 8 bits worth of zeroes is a lot of zeroes.&lt;/p&gt;

&lt;p&gt;For this contract, the fixed-point simulation requires only trivial additional code, which will appear below when the contract computes the &lt;code&gt;totalSupply&lt;/code&gt; of tokens.&lt;/p&gt;

&lt;p&gt;We should note that it appears that the accepted norm is to use &lt;code&gt;decimals = 18&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;transfer-event-required&#34;&gt;&lt;code&gt;Transfer&lt;/code&gt; Event (required)&lt;/h2&gt;

&lt;p&gt;Recall from our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/24/logging-and-watching-solidity-events/&#34;&gt;post&lt;/a&gt; that events are the convenient method the EVM provides for logging information for external consumers.  ERC20 contracts are required to publish events whenever token transfer attempts succeed.  The &lt;code&gt;Transfer&lt;/code&gt; event publishes the &lt;em&gt;from&lt;/em&gt; and &lt;em&gt;to&lt;/em&gt; accounts as well as the token value transferred:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the &lt;em&gt;from&lt;/em&gt; and &lt;em&gt;to&lt;/em&gt; addresses are indexed to help event consumers efficiently monitor only those events they care about.&lt;/p&gt;

&lt;h2 id=&#34;balanceof-required&#34;&gt;&lt;code&gt;balanceOf&lt;/code&gt; (required)&lt;/h2&gt;

&lt;p&gt;ERC20 contracts maintain per-account token balances, which must be accessible via a public view function.  Once again, Solidity makes this easy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By now, this code should look familiar since we used it in our
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;banking&lt;/a&gt;,
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/19/writing-a-crowdfunding-contract-a-la-kickstarter/&#34;&gt;crowdfunding&lt;/a&gt;, and
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/26/what-is-an-ethereum-token/&#34;&gt;simple token&lt;/a&gt;
posts!&lt;/p&gt;

&lt;h2 id=&#34;finally-some-code&#34;&gt;Finally, Some Code!&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ll put the snippets above into a contract to make it more concrete.  For this example, we&amp;rsquo;ll have the contract create 1,000,000 tokens and transfer all of those tokens to the contract&amp;rsquo;s creator account.  I&amp;rsquo;ll add a small constructor that does that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimpleERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Simple ERC20 Token&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;SET&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1000000&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimpleERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Initially assign all tokens to the contract&amp;#39;s creator.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// more stuff to come&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The constructor above does a few notable things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I hardcoded values for &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;decimals&lt;/code&gt;, and &lt;code&gt;totalSupply&lt;/code&gt;.  Obviously, these could have been constructor parameters, or even computed values, but this example is intentionally simple.&lt;/li&gt;
&lt;li&gt;The computation of &lt;code&gt;totalSupply&lt;/code&gt; required scaling due to the use of fixed-point numbers.&lt;/li&gt;
&lt;li&gt;Although the ERC20 standard doesn&amp;rsquo;t explicitly require it, it is considered a best practice to log a &lt;code&gt;Transfer&lt;/code&gt; event indicating the &amp;ldquo;transfer&amp;rdquo; from address &lt;code&gt;0&lt;/code&gt; of tokens to the creator&amp;rsquo;s account (&lt;code&gt;msg.sender&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;transfer-required&#34;&gt;&lt;code&gt;transfer&lt;/code&gt; (required)&lt;/h2&gt;

&lt;p&gt;ERC20 tokens can be transferred directly from their owner&amp;rsquo;s account to any other account with a public &lt;code&gt;transfer&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;           &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// deduct from sender&amp;#39;s balance&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;                  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// add to recipient&amp;#39;s balance&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This (required) transfer function includes some things demanded by the standard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;transfer&lt;/code&gt; requires that the sender/owner has enough tokens to fulfill the transfer.  It will not do a partial transfer.&lt;/li&gt;
&lt;li&gt;Successful transfers must log the appropriate &lt;code&gt;Transfer&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transfer&lt;/code&gt; must return a &lt;code&gt;bool&lt;/code&gt; value representing a successful transfer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please note that the ERC20 token standard is actually silent on whether &lt;code&gt;transfer&lt;/code&gt; should revert when &lt;code&gt;msg.sender&lt;/code&gt; doesn&amp;rsquo;t have sufficient tokens, or if it should simply return &lt;code&gt;false&lt;/code&gt;.  (It must do one of the two.)  I have chosen to have it revert, which seems like a safer choice.&lt;/p&gt;

&lt;h2 id=&#34;delegated-transfer-functionality&#34;&gt;Delegated Transfer Functionality&lt;/h2&gt;

&lt;p&gt;Up to now, the ERC20 standard operations are pretty much what you might expect: inspect balances, directly transfer balances, etc.  In addition to these operations, the standard requires support for a delegated transfer.  In this model, the owner account of tokens can delegate the authority to transfer some of its tokens to another account.  This idea is a bit subtle:  the owner isn&amp;rsquo;t transferring the tokens to another account, but rather allowing that other account to transfer tokens to whomever it wishes.  This facilitates exchange-brokered token transfers.&lt;/p&gt;

&lt;p&gt;Delegated transfers in ERC20 are orchestrated with the following required pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a delegation function (&lt;code&gt;approve&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the subsequent indirect transfer function (&lt;code&gt;transferFrom&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;some state to remember what&amp;rsquo;s been delegated to whom (&lt;code&gt;allowance&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;an event that logs when delegations succeed (&lt;code&gt;Approval&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;approval-event-required&#34;&gt;Approval Event (required)&lt;/h2&gt;

&lt;p&gt;ERC20 requires an event to log the successful approval of a delegated token transfer, which logs the owner, the delegated spender, and the amount:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Just like the &lt;code&gt;Transfer&lt;/code&gt; event, the account addresses are indexed parameters to aid event consumers.&lt;/p&gt;

&lt;h2 id=&#34;allowance-required&#34;&gt;&lt;code&gt;allowance&lt;/code&gt; (required)&lt;/h2&gt;

&lt;p&gt;Because separate transactions delegate token transfer approval and actually transfer those tokens, it&amp;rsquo;s necessary to keep track of which accounts have delegated how much token authority to which other accounts.  Fortunately, this can be done trivially with a nested mapping:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This declaration of &lt;code&gt;allowance&lt;/code&gt; is more complicated that we&amp;rsquo;ve seen before.  The declaration includes a mapping within a mapping, which simply means that every address in the outer mapping will map to a distinct mapping, which will then map addresses to integers.  It&amp;rsquo;s easiest to think of this a two-dimensional mapping, which maps pairs of addresses to integers.  This notion is clearer when you see the getter that the Solidity compiler creates for this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;remaining&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(That&amp;rsquo;s the function required by the ERC20 standard.  I&amp;rsquo;m exploiting the fact that Solidity will generate that automatically from my &lt;code&gt;allowance&lt;/code&gt; declaration.)&lt;/p&gt;

&lt;h2 id=&#34;approve-required&#34;&gt;&lt;code&gt;approve&lt;/code&gt; (required)&lt;/h2&gt;

&lt;p&gt;The ERC20 delegation function, &lt;code&gt;approve&lt;/code&gt;, can be quite short:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A few notes on the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s &lt;code&gt;msg.sender&lt;/code&gt;&amp;rsquo;s account that is delegating a transfer, as can be seen in the adjustment to &lt;code&gt;allowance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A sender &lt;strong&gt;can&lt;/strong&gt; approve a delegated transfer that exceeds their actual token balance.  Because the transfer wouldn&amp;rsquo;t happen until &lt;code&gt;transferFrom&lt;/code&gt; is called, the check for adequate balance is deferred until then.  Therefore, all approvals can succeed.&lt;/li&gt;
&lt;li&gt;Even though all approvals can succeed, the function is still required to return &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approve&lt;/code&gt; must log its parameters with an &lt;code&gt;Approval&lt;/code&gt; event.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;transferfrom&#34;&gt;transferFrom&lt;/h2&gt;

&lt;p&gt;ERC20&amp;rsquo;s &lt;code&gt;transferFrom&lt;/code&gt; function is the most complicated function in ERC20.  &lt;code&gt;transferFrom&lt;/code&gt; is called by the delegated-to account in order to transfer tokens to another account.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There&amp;rsquo;s a lot going on above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;require(value &amp;lt;= balanceOf[from])&lt;/code&gt; guarantees that the delegator actually owns enough tokens to satisfy the transfer request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require(value &amp;lt;= allowance[from][msg.sender])&lt;/code&gt; guarantees that the spender is actually authorized to transfer that many tokens from the delegator&amp;rsquo;s balance.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allowance[from][msg.sender] -= value;&lt;/code&gt; reduces the number of tokens the spender is allowed to transfer on behalf of the delegator.&lt;/li&gt;
&lt;li&gt;Just like for the &lt;code&gt;transfer&lt;/code&gt; function, a successful transfer must log a &lt;code&gt;Transfer&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;As before, if an attempt is made to transfer too many tokens, I&amp;rsquo;ve chosen to revert the transaction rather than return &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ERC20 token contracts must support direct and indirect token transfers.&lt;/li&gt;
&lt;li&gt;ERC20 token contracts optionally support names, symbols, and decimal fixed-point scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;the-whole-erc20-contract&#34;&gt;The Whole ERC20 Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;erc20.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBTaW1wbGVFUkMyMFRva2VuIHsKICAgIC8vIFRyYWNrIGhvdyBtYW55IHRva2VucyBhcmUgb3duZWQgYnkgZWFjaCBhZGRyZXNzLgogICAgbWFwcGluZyAoYWRkcmVzcyA9PiB1aW50MjU2KSBwdWJsaWMgYmFsYW5jZU9mOwoKICAgIHN0cmluZyBwdWJsaWMgbmFtZSA9ICJTaW1wbGUgRVJDMjAgVG9rZW4iOwogICAgc3RyaW5nIHB1YmxpYyBzeW1ib2wgPSAiU0VUIjsKICAgIHVpbnQ4IHB1YmxpYyBkZWNpbWFscyA9IDE4OwoKICAgIHVpbnQyNTYgcHVibGljIHRvdGFsU3VwcGx5ID0gMTAwMDAwMCAqICh1aW50MjU2KDEwKSAqKiBkZWNpbWFscyk7CgogICAgZXZlbnQgVHJhbnNmZXIoYWRkcmVzcyBpbmRleGVkIGZyb20sIGFkZHJlc3MgaW5kZXhlZCB0bywgdWludDI1NiB2YWx1ZSk7CgogICAgZnVuY3Rpb24gU2ltcGxlRVJDMjBUb2tlbigpIHB1YmxpYyB7CiAgICAgICAgLy8gSW5pdGlhbGx5IGFzc2lnbiBhbGwgdG9rZW5zIHRvIHRoZSBjb250cmFjdCdzIGNyZWF0b3IuCiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdID0gdG90YWxTdXBwbHk7CiAgICAgICAgZW1pdCBUcmFuc2ZlcihhZGRyZXNzKDApLCBtc2cuc2VuZGVyLCB0b3RhbFN1cHBseSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmZXIoYWRkcmVzcyB0bywgdWludDI1NiB2YWx1ZSkgcHVibGljIHJldHVybnMgKGJvb2wgc3VjY2VzcykgewogICAgICAgIHJlcXVpcmUoYmFsYW5jZU9mW21zZy5zZW5kZXJdID49IHZhbHVlKTsKCiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdIC09IHZhbHVlOyAgLy8gZGVkdWN0IGZyb20gc2VuZGVyJ3MgYmFsYW5jZQogICAgICAgIGJhbGFuY2VPZlt0b10gKz0gdmFsdWU7ICAgICAgICAgIC8vIGFkZCB0byByZWNpcGllbnQncyBiYWxhbmNlCiAgICAgICAgZW1pdCBUcmFuc2Zlcihtc2cuc2VuZGVyLCB0bywgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGV2ZW50IEFwcHJvdmFsKGFkZHJlc3MgaW5kZXhlZCBvd25lciwgYWRkcmVzcyBpbmRleGVkIHNwZW5kZXIsIHVpbnQyNTYgdmFsdWUpOwoKICAgIG1hcHBpbmcoYWRkcmVzcyA9PiBtYXBwaW5nKGFkZHJlc3MgPT4gdWludDI1NikpIHB1YmxpYyBhbGxvd2FuY2U7CgogICAgZnVuY3Rpb24gYXBwcm92ZShhZGRyZXNzIHNwZW5kZXIsIHVpbnQyNTYgdmFsdWUpCiAgICAgICAgcHVibGljCiAgICAgICAgcmV0dXJucyAoYm9vbCBzdWNjZXNzKQogICAgewogICAgICAgIGFsbG93YW5jZVttc2cuc2VuZGVyXVtzcGVuZGVyXSA9IHZhbHVlOwogICAgICAgIGVtaXQgQXBwcm92YWwobXNnLnNlbmRlciwgc3BlbmRlciwgdmFsdWUpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZmVyRnJvbShhZGRyZXNzIGZyb20sIGFkZHJlc3MgdG8sIHVpbnQyNTYgdmFsdWUpCiAgICAgICAgcHVibGljCiAgICAgICAgcmV0dXJucyAoYm9vbCBzdWNjZXNzKQogICAgewogICAgICAgIHJlcXVpcmUodmFsdWUgPD0gYmFsYW5jZU9mW2Zyb21dKTsKICAgICAgICByZXF1aXJlKHZhbHVlIDw9IGFsbG93YW5jZVtmcm9tXVttc2cuc2VuZGVyXSk7CgogICAgICAgIGJhbGFuY2VPZltmcm9tXSAtPSB2YWx1ZTsKICAgICAgICBiYWxhbmNlT2ZbdG9dICs9IHZhbHVlOwogICAgICAgIGFsbG93YW5jZVtmcm9tXVttc2cuc2VuZGVyXSAtPSB2YWx1ZTsKICAgICAgICBlbWl0IFRyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0K&#34; download=&#39;erc20.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimpleERC20Token&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Track how many tokens are owned by each address.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Simple ERC20 Token&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;symbol&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;SET&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint8&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1000000&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;decimals&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;SimpleERC20Token&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Initially assign all tokens to the contract&amp;#39;s creator.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// deduct from sender&amp;#39;s balance&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// add to recipient&amp;#39;s balance&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;approve&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Approval&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;spender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transferFrom&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;success&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;allowance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>What is an Ethereum Token?</title>
      <link>https://programtheblockchain.com/posts/2018/01/26/what-is-an-ethereum-token/</link>
      <pubDate>Fri, 26 Jan 2018 09:15:05 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/26/what-is-an-ethereum-token/</guid>
      <description>&lt;p&gt;This post explains what an Ethereum &amp;ldquo;token&amp;rdquo; or &amp;ldquo;coin&amp;rdquo; is (and is not).  It will convey an intuitive understanding of tokens and describe the implementation of a very simple token in Solidity.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;cryptocurrencies&#34;&gt;Cryptocurrencies&lt;/h2&gt;

&lt;p&gt;Tokens are similar to blockchain-based cryptocurrencies, so it will be helpful to review a few salient qualities of cryptocurrencies like Bitcoin and Ethereum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cryptocurrencies exist entirely on a blockchain&amp;mdash;any relationship to objects (or currencies) in the physical world is based purely on agreements &lt;em&gt;outside&lt;/em&gt; of the blockchain.&lt;/li&gt;
&lt;li&gt;Cryptocurrency allocations are maintained as per-account balances on the blockchain&amp;mdash;an account only &amp;ldquo;owns&amp;rdquo; an amount of cryptocurrency to the extent that the blockchain&amp;rsquo;s ledger reflects that balance for that account.&lt;/li&gt;
&lt;li&gt;Cryptocurrency balances can change by virtue of verifiable transfers from one account to another on the blockchain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread above is that cryptocurrencies are blockchain entities.  Cryptocurrencies have physical-world value because people are willing to transfer them on the blockchain in exchange for physical-world money, goods or services.&lt;/p&gt;

&lt;h2 id=&#34;cryptocurrency-like-tokens&#34;&gt;Cryptocurrency-like Tokens&lt;/h2&gt;

&lt;p&gt;Our previous
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;post on banking&lt;/a&gt;
demonstrated that smart contracts can trivially maintain per-account balances, and that it&amp;rsquo;s trivial to update those balances via transactions.  Using very similar techniques, a contract could maintain per-account balances of a &lt;em&gt;new&lt;/em&gt; cryptocurrency.  If the contract both maintained per-account balances and supported account-to-account balance transfers, you would have all the necessary components of a cryptocurrency.  Such contracts create &amp;ldquo;tokens&amp;rdquo; (or &amp;ldquo;coins&amp;rdquo;).&lt;/p&gt;

&lt;p&gt;Contracts that create new tokens are very easy to develop and deploy, which is a big reason why so many &amp;ldquo;Initial Coin Offerings&amp;rdquo; are built upon the Ethereum network.&lt;/p&gt;

&lt;h2 id=&#34;a-simple-token-implementation&#34;&gt;A Simple Token Implementation&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;minimal_token.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTk7Cgpjb250cmFjdCBNaW5pbWFsVG9rZW4gewogICAgLy8gVHJhY2sgaG93IG1hbnkgdG9rZW5zIGFyZSBvd25lZCBieSBlYWNoIGFkZHJlc3MuCiAgICBtYXBwaW5nIChhZGRyZXNzID0&amp;#43;IHVpbnQyNTYpIHB1YmxpYyBiYWxhbmNlT2Y7CgogICAgZnVuY3Rpb24gTWluaW1hbFRva2VuKHVpbnQyNTYgdG90YWxTdXBwbHkpIHB1YmxpYyB7CiAgICAgICAgLy8gSW5pdGlhbGx5IGFzc2lnbiBhbGwgdG9rZW5zIHRvIHRoZSBjb250cmFjdCdzIGNyZWF0b3IuCiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdID0gdG90YWxTdXBwbHk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmZXIoYWRkcmVzcyB0bywgdWludDI1NiBhbW91bnQpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gPj0gYW1vdW50KTsKCiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdIC09IGFtb3VudDsgIC8vIGRlZHVjdCBmcm9tIHNlbmRlcidzIGJhbGFuY2UKICAgICAgICBiYWxhbmNlT2ZbdG9dICs9IGFtb3VudDsgICAgICAgICAgLy8gYWRkIHRvIHJlY2lwaWVudCdzIGJhbGFuY2UKICAgIH0KfQo=&#34; download=&#39;minimal_token.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MinimalToken&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Track how many tokens are owned by each address.&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;MinimalToken&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Initially assign all tokens to the contract&amp;#39;s creator.&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;totalSupply&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// deduct from sender&amp;#39;s balance&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;          &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// add to recipient&amp;#39;s balance&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;This contract has the necessary components of a cryptocurrency:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It maintains a per-account balance in the &lt;code&gt;balanceOf&lt;/code&gt; state variable.&lt;/li&gt;
&lt;li&gt;It supports account-to-account transfers via the &lt;code&gt;transfer&lt;/code&gt; function.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note that most tokens built on Ethereum implement a standard called &lt;a href=&#34;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md&#34;&gt;ERC-20&lt;/a&gt;. Tokens implementing this standard API can be viewed and transferred using generic wallet software, and they can be bought and sold on generic currency exchanges. The minimal token described here implements only a subset of the ERC-20 standard. In a future post, we&amp;rsquo;ll implement the rest of the standard.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum tokens (or coins) are tracked by on-blockchain balances maintained by smart contracts.&lt;/li&gt;
&lt;li&gt;Tokens are held by accounts.&lt;/li&gt;
&lt;li&gt;Accounts can (typically) transfer token balances to other accounts.&lt;/li&gt;
&lt;li&gt;Tokens balances and operations are very similar to those of blockchain-based cryptocurrencies.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Logging and Watching Solidity Events</title>
      <link>https://programtheblockchain.com/posts/2018/01/24/logging-and-watching-solidity-events/</link>
      <pubDate>Wed, 24 Jan 2018 08:04:38 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/24/logging-and-watching-solidity-events/</guid>
      <description>

&lt;p&gt;[&lt;strong&gt;EDIT 2018-03-13&lt;/strong&gt;] &lt;em&gt;This post has been updated to use Solidity 0.4.21 event syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Events are a way for smart contracts written in Solidity to log that something has occurred. Interested observers, notably JavaScript front ends for decentralized apps, can watch for events and react accordingly. In this post, I&amp;rsquo;ll show you how to log events from a Solidity smart contract and watch those events in JavaScript. The code in this post builds on the example from the earlier post, &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/&#34;&gt;Building Decentralized Apps With Ethereum and JavaScript&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#34;solidity-events&#34;&gt;Solidity Events&lt;/h2&gt;

&lt;p&gt;Events in Solidity are declared with the &lt;code&gt;event&lt;/code&gt; keyword, and logging an event is done with the &lt;code&gt;emit&lt;/code&gt; keyword. Events can be parameterized. The following code is adapted from the Counter example introduced in &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/&#34;&gt;Writing a Very Simple Smart Contract&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;counter-with-events.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBDb3VudGVyIHsKICAgIHVpbnQyNTYgcHVibGljIGNvdW50ID0gMDsKCiAgICBldmVudCBJbmNyZW1lbnQoYWRkcmVzcyB3aG8pOyAgIC8vIGRlY2xhcmluZyBldmVudAoKICAgIGZ1bmN0aW9uIGluY3JlbWVudCgpIHB1YmxpYyB7CiAgICAgICAgZW1pdCBJbmNyZW1lbnQobXNnLnNlbmRlcik7IC8vIGxvZ2dpbmcgZXZlbnQKICAgICAgICBjb3VudCArPSAxOwogICAgfQp9Cg==&#34; download=&#39;counter-with-events.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;who&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// declaring event&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// logging event&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;The code above introduces the following techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;event Increment(address who)&lt;/code&gt; declares a contract-level event that takes a single parameter of type &lt;code&gt;address&lt;/code&gt; which indicates what address performed the increment operation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emit Increment(msg.sender)&lt;/code&gt; logs the previously declared event with &lt;code&gt;msg.sender&lt;/code&gt; as its argument.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By convention, event names begin with uppercase letters. This distinguishes them from functions.&lt;/p&gt;

&lt;h2 id=&#34;listening-to-events-in-javascript&#34;&gt;Listening to Events in JavaScript&lt;/h2&gt;

&lt;p&gt;The following JavaScript code listens for the &lt;code&gt;Increment&lt;/code&gt; event and updates the UI accordingly. It is adapted from the code in &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/&#34;&gt;Building Decentralized Apps With Ethereum and JavaScript&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.contract(abi).at(address);&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;counter.Increment(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Count was incremented by address: &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result.args.who);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;getCount();&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;getCount();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;contract.Increment(...)&lt;/code&gt; starts listening for the &lt;code&gt;Increment&lt;/code&gt; event, and is parameterized with the callback function.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getCount()&lt;/code&gt; is a function that fetches the latest count and updates the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see this function in action in the &lt;a href=&#34;https://programtheblockchain.com/dapps/counter-with-events/&#34;&gt;&amp;ldquo;Counter Example With Events&amp;rdquo; demo&lt;/a&gt;. Unlike in the original example, now the UI is automatically updated any time the counter is incremented. If you open the app in multiple windows or even on different devices, you will see that incrementing the counter in any instance of the app triggers an update in all of them.&lt;/p&gt;

&lt;h2 id=&#34;indexed-parameters&#34;&gt;Indexed Parameters&lt;/h2&gt;

&lt;p&gt;Up to three of an event&amp;rsquo;s parameters can be marked as &lt;code&gt;indexed&lt;/code&gt;. An &lt;code&gt;indexed&lt;/code&gt; parameter can be used to efficiently filter events. The following code enhances the previous example to track many counters, each identified by a numeric ID:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;multicounter.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMjE7Cgpjb250cmFjdCBNdWx0aWNvdW50ZXIgewogICAgbWFwcGluZyAodWludDI1NiA9PiB1aW50MjU2KSBwdWJsaWMgY291bnRzOwoKICAgIGV2ZW50IEluY3JlbWVudCh1aW50MjU2IGluZGV4ZWQgd2hpY2gsIGFkZHJlc3Mgd2hvKTsKCiAgICBmdW5jdGlvbiBpbmNyZW1lbnQodWludDI1NiB3aGljaCkgcHVibGljIHsKICAgICAgICBlbWl0IEluY3JlbWVudCh3aGljaCwgbXNnLnNlbmRlcik7CiAgICAgICAgY291bnRzW3doaWNoXSArPSAxOwogICAgfQp9Cg==&#34; download=&#39;multicounter.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;21&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Multicounter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;counts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;indexed&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;which&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;who&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;which&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;emit&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;which&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;counts&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;which&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;counts&lt;/code&gt; replaces the previous &lt;code&gt;count&lt;/code&gt; with a &lt;code&gt;mapping&lt;/code&gt; of IDs to counts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event Increment(uint256 indexed which, address who)&lt;/code&gt; adds an indexed parameter &lt;code&gt;which&lt;/code&gt; to indicate which counter was incremented.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emit Increment(which, msg.sender)&lt;/code&gt; logs the event with both arguments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;filtering-events-in-javascript&#34;&gt;Filtering Events in JavaScript&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;https://programtheblockchain.com/dapps/multicounter/&#34;&gt;&amp;ldquo;Multicounter&amp;rdquo; demo&lt;/a&gt; uses the previous Solidity contract and allows the user to watch and manipulate any counter by entering a numeric counter ID. This may seem a bit contrived, but imagine a contract that implements many instances of a two-person game. The participants in the game would be interested only in events for their specific game, so a game ID could be used as an event filter.&lt;/p&gt;

&lt;p&gt;The following code is invoked in the Multicounter demo when the user switches to a new counter ID. It filters for events with the new ID as the &lt;code&gt;which&lt;/code&gt; parameter:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Switching to counter &amp;#39;&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;counterId&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&amp;#39;.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(event&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Stop listening to events with the old ID.&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;event.stopWatching();&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;event&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;counter.Increment({&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;which:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;counterId&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Counter &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result.args.which&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot; was incremented by address: &amp;quot;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result.args.who);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;getCount();&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;getCount();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a brief explanation of the above code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first parameter to &lt;code&gt;Increment&lt;/code&gt; specifies a filter. Only events matching the filter will trigger the callback function. The simplest type of a filter is used here: a dictionary mapping parameter names to values.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event = counter.Increment(...)&lt;/code&gt; captures an event object. This can be used to stop and start listening to the event.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event.stopWatching()&lt;/code&gt; stops monitoring for events with the old counter ID.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;event-limitations&#34;&gt;Event Limitations&lt;/h2&gt;

&lt;p&gt;Events are built on top of a lower level log interface in Ethereum. Although you typically won&amp;rsquo;t deal with log messages directly, it&amp;rsquo;s important to understand their limitations.&lt;/p&gt;

&lt;p&gt;Logs are structured as up to four &amp;ldquo;topics&amp;rdquo; and a &amp;ldquo;data&amp;rdquo; field. The first topic is used to store the hash of the event&amp;rsquo;s signature, which leaves only three topics for &lt;code&gt;indexed&lt;/code&gt; parameters. Topics are required to be 32 bytes long, so if you use an array for an &lt;code&gt;indexed&lt;/code&gt; parameter (including types &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;bytes&lt;/code&gt;), the value will first be hashed to fit into 32 bytes. Non-&lt;code&gt;indexed&lt;/code&gt; parameters are stored in the data field and do not have a size limit.&lt;/p&gt;

&lt;p&gt;Logs, and therefore events, are not accessible from within the Ethereum virtual machine (EVM). This means that contracts cannot read their own logs or the logs of other contracts.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solidity provides a way to log events during transactions.&lt;/li&gt;
&lt;li&gt;Decentralized app (DApp) front ends can subscribe to these events.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;indexed&lt;/code&gt; parameters provide an efficient means for filtering events.&lt;/li&gt;
&lt;li&gt;Events are limited by the underlying log mechanism upon which they are built.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://solidity.readthedocs.io/en/develop/contracts.html#events&#34;&gt;The Solidity documentation on events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events&#34;&gt;The web3.js documentation on events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;View the page source for the &lt;a href=&#34;https://programtheblockchain.com/dapps/counter-with-events/&#34;&gt;&amp;ldquo;Counter With Events&amp;rdquo; demo&lt;/a&gt; and the &lt;a href=&#34;https://programtheblockchain.com/dapps/multicounter/&#34;&gt;&amp;ldquo;Multicounter&amp;rdquo; demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Writing a Crowdfunding Contract (a la Kickstarter)</title>
      <link>https://programtheblockchain.com/posts/2018/01/19/writing-a-crowdfunding-contract-a-la-kickstarter/</link>
      <pubDate>Fri, 19 Jan 2018 06:11:30 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/19/writing-a-crowdfunding-contract-a-la-kickstarter/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a smart contract that controls a crowdfunding effort in the spirit of &lt;a href=&#34;https://www.kickstarter.com/&#34;&gt;Kickstarter&lt;/a&gt;.  It assumes that you have read our previous posts on
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;banking&lt;/a&gt; and
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/12/writing-a-contract-that-handles-time/&#34;&gt;time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Kickstarter crowdfunding efforts are
&amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Assurance_contract&#34;&gt;assurance contracts&lt;/a&gt;&amp;rdquo;,
which enable projects to raise money from a group of people based on a simple concept:  during a fixed crowdfunding period of time, funders pledge funds in an attempt to raise a total amount that meets a fixed goal amount.  If pledges meet the goal before the period expires, the funds are transferred to the project so that it may proceed.  If pledges are insufficient when the period expires, the funds are refunded to the funders.&lt;/p&gt;

&lt;h2 id=&#34;parameterizing-the-crowdfunding-contract&#34;&gt;Parameterizing the Crowdfunding Contract&lt;/h2&gt;

&lt;p&gt;This smart contract is parameterized by two values:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The crowdfunding period (in days).  (This is very similar to the &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/12/writing-a-contract-that-handles-time/&#34;&gt;time&lt;/a&gt; post.)&lt;/li&gt;
&lt;li&gt;The goal amount (in wei).&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The contract keeps track of the owner/crowdfunding account, and it keeps track of the total amount pledged by each account. (This is very similar to the &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;banking&lt;/a&gt; post.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Crowdfunding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Crowdfunding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// ...to be filled in soon...&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;accepting-pledges&#34;&gt;Accepting Pledges&lt;/h2&gt;

&lt;p&gt;Accepting a pledge is pretty straightforward as well.  The function is parameterized by the value attached.  (This parameter is checked as a safety measure to avoid accidentally attaching the wrong amount.)  It updates the amount pledged by the sending account and determines if the funding goal has been met.&lt;/p&gt;

&lt;p&gt;For simplicity&amp;rsquo;s sake, this contract will strictly divide time into two distinct periods:  the fundraising period and the withdrawal period.  During the fundraising period, the contract will accept pledges, but it will not allow withdrawals.  During the withdrawal period, the contract will not accept pledges, but it will allow withdrawals.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;                &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// in the fundraising period&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;withdrawing-funds&#34;&gt;Withdrawing Funds&lt;/h2&gt;

&lt;p&gt;Funds can only be withdrawn after the deadline passes.  As described above, who can withdraw funds depends on whether or not the goal was met.&lt;/p&gt;

&lt;p&gt;To separate the logic guarding who can withdraw funds when, I&amp;rsquo;ve split the functionality into two routines:  &lt;code&gt;claimFunds&lt;/code&gt; (for the owner), and &lt;code&gt;getRefund&lt;/code&gt; (for the funders):&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimFunds&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// funding goal is met&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;               &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// in the withdrawal period&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getRefund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// funding goal not met&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;               &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// in the withdrawal period&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
    &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above includes a few notable things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whenever transferring funds out of a contract, it&amp;rsquo;s &lt;strong&gt;really important&lt;/strong&gt; for a contract to make sure the conditions are correct.  Both &lt;code&gt;claimFunds&lt;/code&gt; and &lt;code&gt;getRefund&lt;/code&gt; check multiple conditions.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;getRefund&lt;/code&gt; routine sets the account&amp;rsquo;s &lt;code&gt;pledgeOf&lt;/code&gt; value to 0 &lt;strong&gt;before&lt;/strong&gt; doing the transfer.  This is a safety precaution, which is described fully in the
&lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/&#34;&gt;banking post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;There is a subtlety to the &lt;code&gt;address(this).balance &amp;lt; goal&lt;/code&gt; test in &lt;code&gt;getRefund&lt;/code&gt;.  Each successful refund will change the value of &lt;code&gt;address(this).balance&lt;/code&gt;, which will affect subsequent refund attempts.  It is important that such changes not affect future tests of the success of the crowdfunding.  In this case that invariant is maintained because refunds &lt;em&gt;decrease&lt;/em&gt; &lt;code&gt;address(this).balance&lt;/code&gt;, which means that &lt;code&gt;address(this).balance &amp;lt; goal&lt;/code&gt; will remain true.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;p&gt;By (carefully) combining techniques for keeping track of time and per-account balances, a small smart contract can implement a Kickstarter-like crowdfunding.&lt;/p&gt;

&lt;h2 id=&#34;the-complete-contract&#34;&gt;The Complete Contract&lt;/h2&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;crowdfunding.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTk7Cgpjb250cmFjdCBDcm93ZGZ1bmRpbmcgewogICAgYWRkcmVzcyBvd25lcjsKICAgIHVpbnQyNTYgZGVhZGxpbmU7CiAgICB1aW50MjU2IGdvYWw7CiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gdWludDI1NikgcHVibGljIHBsZWRnZU9mOwoKICAgIGZ1bmN0aW9uIENyb3dkZnVuZGluZyh1aW50MjU2IG51bWJlck9mRGF5cywgdWludDI1NiBfZ29hbCkgcHVibGljIHsKICAgICAgICBvd25lciA9IG1zZy5zZW5kZXI7CiAgICAgICAgZGVhZGxpbmUgPSBub3cgKyAobnVtYmVyT2ZEYXlzICogMSBkYXlzKTsKICAgICAgICBnb2FsID0gX2dvYWw7CiAgICB9CgogICAgZnVuY3Rpb24gcGxlZGdlKHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShub3cgPCBkZWFkbGluZSk7ICAgICAgICAgICAgICAgIC8vIGluIHRoZSBmdW5kcmFpc2luZyBwZXJpb2QKICAgICAgICByZXF1aXJlKG1zZy52YWx1ZSA9PSBhbW91bnQpOwoKICAgICAgICBwbGVkZ2VPZlttc2cuc2VuZGVyXSArPSBhbW91bnQ7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhaW1GdW5kcygpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShhZGRyZXNzKHRoaXMpLmJhbGFuY2UgPj0gZ29hbCk7IC8vIGZ1bmRpbmcgZ29hbCBtZXQKICAgICAgICByZXF1aXJlKG5vdyA&amp;#43;PSBkZWFkbGluZSk7ICAgICAgICAgICAgICAgLy8gaW4gdGhlIHdpdGhkcmF3YWwgcGVyaW9kCiAgICAgICAgcmVxdWlyZShtc2cuc2VuZGVyID09IG93bmVyKTsKCiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFJlZnVuZCgpIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShhZGRyZXNzKHRoaXMpLmJhbGFuY2UgPCBnb2FsKTsgIC8vIGZ1bmRpbmcgZ29hbCBub3QgbWV0CiAgICAgICAgcmVxdWlyZShub3cgPj0gZGVhZGxpbmUpOyAgICAgICAgICAgICAgIC8vIGluIHRoZSB3aXRoZHJhd2FsIHBlcmlvZAoKICAgICAgICB1aW50MjU2IGFtb3VudCA9IHBsZWRnZU9mW21zZy5zZW5kZXJdOwogICAgICAgIHBsZWRnZU9mW21zZy5zZW5kZXJdID0gMDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9Cn0KCg==&#34; download=&#39;crowdfunding.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Crowdfunding&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Crowdfunding&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledge&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;                &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// in the fundraising period&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;claimFunds&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// funding goal met&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;               &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// in the withdrawal period&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getRefund&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;goal&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// funding goal not met&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;               &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// in the withdrawal period&lt;/span&gt;

        &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;pledgeOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Verifying Contract Source Code</title>
      <link>https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/</link>
      <pubDate>Tue, 16 Jan 2018 09:16:05 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/</guid>
      <description>&lt;p&gt;For a deployed smart contract to be trusted, its source code should be available for inspection. This post explains why source code for smart contracts should be published and how someone can verify that published source code corresponds to a given deployed smart contract.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;trusting-smart-contracts&#34;&gt;Trusting Smart Contracts&lt;/h2&gt;

&lt;p&gt;The power of smart contracts is that they&amp;rsquo;re &amp;ldquo;trustless.&amp;rdquo; Once deployed, a smart contract is immutable and tamper-proof. It is guaranteed to execute exactly the code that was written. That guarantee, however, is only meaningful if you know what code is being executed.&lt;/p&gt;

&lt;p&gt;Everything on the blockchain is public, including smart contracts&amp;rsquo; bytecode, but bytecode is low-level and quite difficult to understand. The source code, written in Solidity, is much more useful. If you want other people to trust your smart contracts, you should publish the source code, and before you interact with someone else&amp;rsquo;s smart contract, you should examine their source code.&lt;/p&gt;

&lt;p&gt;This raises an important question: &lt;em&gt;what prevents a malicious developer from publishing fake source code for their contract&lt;/em&gt;?&lt;/p&gt;

&lt;h2 id=&#34;verifying-source-code&#34;&gt;Verifying Source Code&lt;/h2&gt;

&lt;p&gt;As you may recall from our recent post &lt;a href=&#34;https://programtheblockchain.com/posts/2018/01/09/how-smart-contract-deployment-works/&#34;&gt;How Smart Contract Deployment Works&lt;/a&gt;, the transaction that deploys a smart contract has a payload that is derived from the compiled source code and any constructor parameters. This process is fully deterministic, so if you compile the same source code with the same compiler and apply the same constructor parameters, you&amp;rsquo;ll get the exact same payload.&lt;/p&gt;

&lt;p&gt;This repeatable process is the key to verifying the correspondence between Solidity source code and a deployed smart contract. When publishing your source code, you need to provide all the necessary information to recreate the deployment payload. In addition to the source code itself, you need to share what compiler settings you used, what version of the compiler you used, and what constructor parameters you applied. Anyone can then generate the corresponding deployment payload, and then they can find the transaction on the blockchain that created the smart contract in question. If the two payloads match, then the provided source code was, in fact, what was used to deploy that smart contract.&lt;/p&gt;

&lt;p&gt;This process is a bit cumbersome, so most people choose to delegate this responsibility to a third party.&lt;/p&gt;

&lt;h2 id=&#34;publishing-and-finding-source-code-on-etherscan&#34;&gt;Publishing and Finding Source Code on Etherscan&lt;/h2&gt;

&lt;p&gt;&lt;a href=&#34;https://etherscan.io&#34;&gt;Etherscan&lt;/a&gt; is a highly-regarded set of tools and services for reading information from the Ethereum blockchain. Among other things, they provide source code verification as a service. Anyone can use their &lt;a href=&#34;https://etherscan.io/verifyContract&#34;&gt;verify contract code tool&lt;/a&gt; to associate source code with any deployed contract. The tool will build the deployment payload, verify that the payload matches what&amp;rsquo;s found on the blockchain, and only then associate the payload with the contract. As long as people trust Etherscan to perform this verification process correctly, they don&amp;rsquo;t need to go through the verification steps themselves.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;If Etherscan has verified source code for a deployed contract, you can find that code in the &amp;ldquo;Contract Source&amp;rdquo; tab when viewing the contract&amp;rsquo;s address. For example, the &lt;a href=&#34;https://programtheblockchain.com/dapps/counter/&#34;&gt;Counter Example DApp&lt;/a&gt; is published to the Ropsten test network. I verified its source code, so you can &lt;a href=&#34;https://ropsten.etherscan.io/address/0xf15090c01bec877a122b567e5552504e5fd22b79#code&#34;&gt;view the source code on Etherscan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Because of the deterministic nature of this process, you don&amp;rsquo;t need to verify the source code again if you deploy a new smart contract using the same source code, the same compiler settings, and the same constructor parameters. Etherscan associates the source code with &lt;em&gt;the deployment payload&lt;/em&gt;, not the individual contract address, so you&amp;rsquo;ll see the source code immediately after you deploy.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Smart contracts can&amp;rsquo;t truly be trusted unless their source code is available.&lt;/li&gt;
&lt;li&gt;Source code needs to be verified to make sure it&amp;rsquo;s what was actually compiled and deployed.&lt;/li&gt;
&lt;li&gt;Source code verification is possible because the deployment payload is deterministic.&lt;/li&gt;
&lt;li&gt;Etherscan offers smart contract code verification as a service to make the process easier.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;Etherscan doesn&amp;rsquo;t check for an exact match of the &lt;em&gt;full&lt;/em&gt; payload data. It specifically checks the compiled bytecode and the constructor parameters. The payload also contains &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/metadata.html&#34;&gt;metadata&lt;/a&gt; that includes hashes of each source file. By ignoring this metadata, Etherscan can verify source code with changes to whitespace or comments.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Contract That Handles Time</title>
      <link>https://programtheblockchain.com/posts/2018/01/12/writing-a-contract-that-handles-time/</link>
      <pubDate>Fri, 12 Jan 2018 09:22:33 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/12/writing-a-contract-that-handles-time/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a simple, but complete, smart contract in Solidity that deals with time.  It assumes that you have read our previous post, &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/26/checking-the-sender-in-a-smart-contract/&#34;&gt;Checking the Sender In a Smart Contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you may want your smart contract to respond to transactions differently after some point in the future.  To do this, the contract needs to have a way to express and store values that represent time.  The Ethereum Virtual Machine represents time as the (integer) number of seconds since the &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_epoch&#34;&gt;Unix epoch&lt;/a&gt;&amp;rdquo;, and the current time is accessible to a Solidity program as &lt;code&gt;now&lt;/code&gt;, which is an alias for &lt;code&gt;block.timestamp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The code below creates a smart contract that does nothing beyond remembering when it was created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Time&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;createTime&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Time&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;createTime&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This contract demonstrates the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The system-defined variable &lt;code&gt;now&lt;/code&gt; contains the current time in seconds since the Unix epoch.  This is defined as the timestamp of the block (on the blockchain) that the transaction is a part of.&lt;/li&gt;
&lt;li&gt;The natural unit of time in the EVM is seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;relative-time&#34;&gt;Relative Time&lt;/h2&gt;

&lt;p&gt;To demonstrate using time to influence transaction processing, I am going to develop a smart contract to help me save money for a specified period of time.  During that period, I (or anybody else!) can deposit ether in the contract, but the contract will not let me withdraw any ether until the waiting period is over.&lt;/p&gt;

&lt;p&gt;Solidity has &amp;ldquo;time units&amp;rdquo; built in.  I can specify &lt;code&gt;3 days&lt;/code&gt; or &lt;code&gt;5 years&lt;/code&gt;, for instance.  The savings contract will be parameterized by a waiting period specified in days.  Because the EVM naturally stores time in seconds, the contract must scale the waiting period by the number of seconds in a day, which is given by the literal &lt;code&gt;1 days&lt;/code&gt; in Solidity.&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;savings.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTk7Cgpjb250cmFjdCBTYXZpbmdzIHsKICAgIGFkZHJlc3Mgb3duZXI7CiAgICB1aW50MjU2IGRlYWRsaW5lOwoKICAgIG1vZGlmaWVyIG9ubHlPd25lcigpIHsKICAgICAgICByZXF1aXJlKG1zZy5zZW5kZXIgPT0gb3duZXIpOwogICAgICAgIF87CiAgICB9CgogICAgZnVuY3Rpb24gZGVwb3NpdCh1aW50MjU2IGFtb3VudCkgcHVibGljIHBheWFibGUgewogICAgICAgIHJlcXVpcmUobXNnLnZhbHVlID09IGFtb3VudCk7CiAgICB9CgogICAgZnVuY3Rpb24gU2F2aW5ncyh1aW50MjU2IG51bWJlck9mRGF5cykgcHVibGljIHBheWFibGUgewogICAgICAgIG93bmVyID0gbXNnLnNlbmRlcjsKICAgICAgICBkZWFkbGluZSA9IG5vdyArIChudW1iZXJPZkRheXMgKiAxIGRheXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHdpdGhkcmF3KCkgcHVibGljIG9ubHlPd25lciB7CiAgICAgICAgcmVxdWlyZShub3cgPj0gZGVhZGxpbmUpOwoKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFkZHJlc3ModGhpcykuYmFsYW5jZSk7CiAgICB9Cn0KCg==&#34; download=&#39;savings.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Savings&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Savings&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;numberOfDays&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;days&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;onlyOwner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deadline&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;The code above demonstrates the following new concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(numberOfDays * 1 days)&lt;/code&gt; computes the time in seconds in &lt;code&gt;numberOfDays&lt;/code&gt; days.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;now + (numberOfDays * 1 days)&lt;/code&gt; computes the EVM time that represents &lt;code&gt;numberOfDays&lt;/code&gt; days in the future.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;now &amp;gt;= deadline&lt;/code&gt; tests if the current time is greater than or equal to &lt;code&gt;deadline&lt;/code&gt;.  (I.e, has the deadline passed?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Savings contract is parameterized by the number of days during which no withdrawals are permitted.  During that period, any &lt;code&gt;withdraw&lt;/code&gt; transactions will simply fail.  After that time has elapsed, withdrawals will succeed.&lt;/p&gt;

&lt;p&gt;Deposits are allowed at any time.  Note also that the constructor has the &lt;code&gt;payable&lt;/code&gt; modifier, which allows ether to be attached (and transferred) to the contract during deployment.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Each block in the blockchain includes a timestamp specified as the number of seconds since the Unix epoch.  Time values are integers.&lt;/li&gt;
&lt;li&gt;Solidity smart contracts can access the timestamp of the current block as &lt;code&gt;now&lt;/code&gt; or &lt;code&gt;block.timestamp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Solidity provides convenient time units like &lt;code&gt;days&lt;/code&gt; and &lt;code&gt;years&lt;/code&gt;, which are helpful in computing time spans.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;additional-resources&#34;&gt;Additional Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://solidity.readthedocs.io/en/develop/units-and-global-variables.html&#34;&gt;Units and Globally Available Variables&lt;/a&gt; has more information about units of time in Solidity.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>How Smart Contract Deployment Works</title>
      <link>https://programtheblockchain.com/posts/2018/01/09/how-smart-contract-deployment-works/</link>
      <pubDate>Tue, 09 Jan 2018 07:20:47 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/09/how-smart-contract-deployment-works/</guid>
      <description>

&lt;p&gt;&lt;em&gt;[This blog post explains a little bit about how smart contract deployment works in an Ethereum network, but it is &lt;strong&gt;not&lt;/strong&gt; necessary for learning Solidity programming.  We write it for those of you who&amp;rsquo;d like a little deeper understanding of what is going on when a smart contracts are deployed.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In our
&lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/&#34;&gt;How Ethereum Transactions Work&lt;/a&gt;
post, we described the essential elements of a transaction message in an Ethereum network and how they work.  This post will similarly describe how smart contracts are initially deployed to the network.&lt;/p&gt;

&lt;h2 id=&#34;smart-contract-deployments-are-transactions&#34;&gt;Smart Contract Deployments Are Transactions&lt;/h2&gt;

&lt;p&gt;The Ethereum network has only one transaction mechanism, which is overloaded to handle three distinct kinds of transactions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A simple ether transfer to an externally owned account&lt;/li&gt;
&lt;li&gt;Invocation of code associated with a previously deployed smart contract (and possibly an ether transfer)&lt;/li&gt;
&lt;li&gt;Deployment of a smart contract (and possibly an ether transfer to the corresponding deployed contract)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contract deployment is by far the most subtle operation.  To understand it, let&amp;rsquo;s review the components of a transaction message:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recipient&lt;/li&gt;
&lt;li&gt;value&lt;/li&gt;
&lt;li&gt;data&lt;/li&gt;
&lt;li&gt;gas limit&lt;/li&gt;
&lt;li&gt;gas price&lt;/li&gt;
&lt;li&gt;nonce&lt;/li&gt;
&lt;li&gt;signature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For contract deployment, there is nothing unique about the value (attached ether), the gas limit and price, the nonce, or the signature.  The recipient and the data, however, are special:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;recipient&lt;/strong&gt; For contract deployment, the recipient address is 0. This signifies that the transaction creates a contract.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data&lt;/strong&gt; For contract deployment, the data field holds code to be executed during deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;contract-initialization&#34;&gt;Contract Initialization&lt;/h2&gt;

&lt;p&gt;The data field of a contract deployment transaction is code &lt;em&gt;to be executed during contract initialization&lt;/em&gt;. It is not the code that is executed on subsequent transactions sent to the contract. That code is &lt;em&gt;returned&lt;/em&gt; by the initialization code. Essentially, the code in the data field is a program that is going to write a program that gets deployed as a smart contract. Although that sounds fairly open-ended and complex, in practice it is typically quite straightforward. The standard initialization code generated by the Solidity compiler does the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Runs the code in the contract&amp;rsquo;s constructor, setting storage values, etc.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Copies&lt;/em&gt; the code for the rest of the contract into memory and returns it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The code to be copied is simply appended to the constructor&amp;rsquo;s code in the data field.&lt;/p&gt;

&lt;p&gt;Constructor parameters are handled similarly. They are stored last in the data field, and the initialization code reads them from there.&lt;/p&gt;

&lt;h2 id=&#34;the-address-of-the-deployed-contract&#34;&gt;The Address of the Deployed Contract&lt;/h2&gt;

&lt;p&gt;Once a contract is deployed, it is referenced by its address, which is guaranteed to be unique.  Computing the address requires only the address of the sender account and the sender&amp;rsquo;s nonce.  Per Section 7, &amp;ldquo;Contract Creation,&amp;rdquo; of &lt;a href=&#34;http://gavwood.com/paper.pdf&#34;&gt;the Ethereum yellow paper&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The address of the new account is defined as being the rightmost 160 bits of the Keccak hash of the RLP encoding of the structure containing only the sender and the nonce.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Externally owned accounts have nonces that start at zero and increase with each transaction. Contracts can also deploy other contracts, so they also need to have nonces. Per &lt;a href=&#34;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-161.md&#34;&gt;EIP-161&lt;/a&gt;, contracts start with a nonce of 1. This is a fairly recent change, so you may still see older deployed contracts with nonces of 0.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; The nonce for a contract account only increases when it deploys a new contract. &amp;ldquo;Internal transactions&amp;rdquo; (when a contract calls into another contract or transfers ether) do not increase the contract&amp;rsquo;s nonce.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Contract deployment is a special Ethereum transaction sent to the address 0.&lt;/li&gt;
&lt;li&gt;The deployment has the side effects of creating bytecode at a specific address (i.e, it creates a smart contract account).&lt;/li&gt;
&lt;li&gt;Contracts are deployed at predictable addresses based on the address and nonce of the account creating the contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;

&lt;p&gt;An excellent, although much more detailed, explanation can be found in &lt;a href=&#34;https://medium.com/@hayeah/diving-into-the-ethereum-vm-part-5-the-smart-contract-creation-process-cb7b6133b855&#34;&gt;Diving Into The Ethereum VM Part 5 — The Smart Contract Creation Process&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The definitive explanation is in the
&lt;a href=&#34;http://gavwood.com/paper.pdf&#34;&gt;Ethereum yellow paper&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;On some test networks, the nonce starts at a different value (to avoid replay attacks between networks). So it would be more accurate to say that contract nonces start at &lt;em&gt;n&lt;/em&gt;+1, where &lt;em&gt;n&lt;/em&gt; is the initial nonce for an account.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Writing a Banking Contract</title>
      <link>https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/</link>
      <pubDate>Fri, 05 Jan 2018 13:10:30 -0800</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/05/writing-a-banking-contract/</guid>
      <description>&lt;p&gt;This article will demonstrate how to write a simple, but complete, smart contract in Solidity that acts like a bank that stores ether on behalf of its clients.  The contract will allow deposits from any account, and can be trusted to allow withdrawals only by accounts that have sufficient funds to cover the requested withdrawal.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This post assumes that you are comfortable with the ether-handling concepts introduced in our post,
&lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/&#34;&gt;Writing a Contract That Handles Ether&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That post demonstrated how to restrict ether withdrawals to an &amp;ldquo;owner&amp;rsquo;s&amp;rdquo; account.  It did this by persistently storing the owner account&amp;rsquo;s address, and then comparing it to the &lt;code&gt;msg.sender&lt;/code&gt; value for any withdrawal attempt.  Here&amp;rsquo;s a slightly simplified version of that smart contract, which allows anybody to &lt;code&gt;deposit&lt;/code&gt; money, but only allows the &lt;code&gt;owner&lt;/code&gt; to make withdrawals:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// current owner of the contract&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;maintaining-individual-account-balances&#34;&gt;Maintaining Individual Account Balances&lt;/h2&gt;

&lt;p&gt;I am going to generalize this contract to keep track of ether deposits based on the account address of the depositor, and then only allow that same account to make withdrawals of that ether.  To do this, we need a way keep track of account balances for each depositing account—a mapping from accounts to balances.  Fortunately, Solidity provides a ready-made &lt;code&gt;mapping&lt;/code&gt; data type that can map account addresses to integers, which will make this bookkeeping job quite simple.  (This mapping structure is much more general key/value mapping than just addresses to integers, but that&amp;rsquo;s all we need here.)&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the code to accept deposits and track account balances:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bank&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// balances, indexed by addresses&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// adjust the account&amp;#39;s balance&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here are the new concepts in the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mapping(address =&amp;gt; uint256) public balanceOf;&lt;/code&gt; declares a persistent public variable, &lt;code&gt;balanceOf&lt;/code&gt;, that is a mapping from account addresses to 256-bit unsigned integers.  Those integers will represent the current balance of ether stored by the contract on behalf of the corresponding address.&lt;/li&gt;
&lt;li&gt;Mappings can be indexed just like arrays/lists/dictionaries/tables in most modern programming languages.&lt;/li&gt;
&lt;li&gt;The value of a missing mapping value is 0.  Therefore, we can trust that the beginning balance for all account addresses will effectively be zero prior to the first deposit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It&amp;rsquo;s important to note that &lt;code&gt;balanceOf&lt;/code&gt; keeps track of the ether balances assigned to each account, but it does not actually move any ether anywhere.  The bank contract&amp;rsquo;s ether balance is the sum of all the balances of all accounts—only &lt;code&gt;balanceOf&lt;/code&gt; tracks how much of that is assigned to each account.&lt;/p&gt;

&lt;p&gt;Note also that this contract doesn&amp;rsquo;t need a constructor.  There is no persistent state to initialize other than the &lt;code&gt;balanceOf&lt;/code&gt; mapping, which already provides default values of 0.&lt;/p&gt;

&lt;h2 id=&#34;withdrawals-and-account-balances&#34;&gt;Withdrawals and Account Balances&lt;/h2&gt;

&lt;p&gt;Given the &lt;code&gt;balanceOf&lt;/code&gt; mapping from account addresses to ether amounts, the remaining code for a fully-functional bank contract is pretty small.  I&amp;rsquo;ll simply add a withdrawal function:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;bank.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTk7Cgpjb250cmFjdCBCYW5rIHsKCiAgICBtYXBwaW5nKGFkZHJlc3MgPT4gdWludDI1NikgcHVibGljIGJhbGFuY2VPZjsgICAvLyBiYWxhbmNlcywgaW5kZXhlZCBieSBhZGRyZXNzZXMKCiAgICBmdW5jdGlvbiBkZXBvc2l0KHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgcGF5YWJsZSB7CiAgICAgICAgcmVxdWlyZShtc2cudmFsdWUgPT0gYW1vdW50KTsKICAgICAgICBiYWxhbmNlT2ZbbXNnLnNlbmRlcl0gKz0gYW1vdW50OyAgICAgLy8gYWRqdXN0IHRoZSBhY2NvdW50J3MgYmFsYW5jZQogICAgfQoKICAgIGZ1bmN0aW9uIHdpdGhkcmF3KHVpbnQyNTYgYW1vdW50KSBwdWJsaWMgewogICAgICAgIHJlcXVpcmUoYW1vdW50IDw9IGJhbGFuY2VPZlttc2cuc2VuZGVyXSk7CiAgICAgICAgYmFsYW5jZU9mW21zZy5zZW5kZXJdIC09IGFtb3VudDsKICAgICAgICBtc2cuc2VuZGVyLnRyYW5zZmVyKGFtb3VudCk7CiAgICB9Cn0K&#34; download=&#39;bank.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Bank&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;mapping&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// balances, indexed by addresses&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;     &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// adjust the account&amp;#39;s balance&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;balanceOf&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;The code above demonstrates the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;require(amount &amp;lt;= balances[msg.sender])&lt;/code&gt; checks to make sure the sender has sufficient funds to cover the requested withdrawal.  If not, then the transaction aborts without making any state changes or ether transfers.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;balanceOf&lt;/code&gt; mapping must be updated to reflect the lowered residual amount after the withdrawal.&lt;/li&gt;
&lt;li&gt;The funds must be sent to the sender requesting the withdrawal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;important-avoiding-the-reentrancy-vulnerability&#34;&gt;Important:  Avoiding the Reentrancy Vulnerability&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;withdraw()&lt;/code&gt; function above, it is very important to adjust &lt;code&gt;balanceOf[msg.sender]&lt;/code&gt; &lt;strong&gt;before&lt;/strong&gt; transferring ether to avoid an exploitable vulnerability.  The reason is specific to smart contracts and the fact that a transfer to a smart contract executes code in that smart contract.
(The essentials of Ethereum transactions are discussed in
&lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/&#34;&gt;How Ethereum Transactions Work&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Now, suppose that the code in &lt;code&gt;withdraw()&lt;/code&gt; did not adjust &lt;code&gt;balanceOf[msg.sender]&lt;/code&gt; before making the transfer &lt;em&gt;and&lt;/em&gt; suppose that &lt;code&gt;msg.sender&lt;/code&gt; was a malicious smart contract.  Upon receiving the transfer&amp;mdash;handled by &lt;code&gt;msg.sender&lt;/code&gt;&amp;rsquo;s fallback function&amp;mdash;that malicious contract could initiate &lt;em&gt;another&lt;/em&gt; withdrawal from the banking contract.  When the banking contract handles this second withdrawal request, it would have already transferred ether for the original withdrawal, but it would not have an updated balance, so it would allow this second withdrawal!&lt;/p&gt;

&lt;p&gt;This vulnerability is called a &amp;ldquo;reentrancy&amp;rdquo; bug because it happens when a smart contract invokes code in a different smart contract that then calls back into the original, thereby reentering the exploitable contract.  For this reason, it&amp;rsquo;s essential to always make sure a contract&amp;rsquo;s internal state is fully updated before it potentially invokes code in another smart contract.  (And, it&amp;rsquo;s essential to remember that every transfer to a smart contract executes that contract&amp;rsquo;s code.)&lt;/p&gt;

&lt;p&gt;To avoid this sort of reentrancy bug, follow the &amp;ldquo;Checks-Effects-Interactions pattern&amp;rdquo; as &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/security-considerations.html#re-entrancy&#34;&gt;described in the Solidity documentation&lt;/a&gt;. The &lt;code&gt;withdraw()&lt;/code&gt; function above is an example of implementing this pattern.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solidity supports a key/value data type called &lt;code&gt;mapping&lt;/code&gt;.  The default value associated with a missing key is 0.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;mapping(address =&amp;gt; unint256)&lt;/code&gt; enables straightforward accounting of per-account ether balances.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;

&lt;p&gt;Much more detailed explanations of the reentrancy vulnerability can be found
&lt;a href=&#34;https://medium.com/@gus_tavo_guim/reentrancy-attack-on-smart-contracts-how-to-identify-the-exploitable-and-an-example-of-an-attack-4470a2d8dfe4&#34;&gt;here&lt;/a&gt;,
&lt;a href=&#34;http://hackingdistributed.com/2016/07/13/reentrancy-woes/&#34;&gt;here&lt;/a&gt;, and
&lt;a href=&#34;https://github.com/PeterBorah/smart-contract-security-examples/issues/3&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;Note that &lt;code&gt;transfer&lt;/code&gt; and &lt;code&gt;send&lt;/code&gt; themselves also mitigate this vulnerability. They forward very little gas to the recipient&amp;mdash;so little that a reentrant call is not possible. Nonetheless, we recommend that you follow the Checks-Effects-Interactions pattern as a matter of habit, because other types of interactions do not share this mitigation.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Making Smart Contracts with Public Variables</title>
      <link>https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/</link>
      <pubDate>Tue, 02 Jan 2018 07:08:58 -0500</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/</guid>
      <description>

&lt;p&gt;State variables in Solidity, like functions, have a notion of visibility. By default, they are not marked as &amp;ldquo;public,&amp;rdquo; but this is a somewhat confusing concept in the context of a public blockchain, where &lt;em&gt;all&lt;/em&gt; data can be read by anyone. In this post, I&amp;rsquo;ll give an overview of state variable visibility and explain why and how to mark a state variable as &lt;code&gt;public&lt;/code&gt;.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&#34;nothing-is-hidden&#34;&gt;Nothing is Hidden&lt;/h2&gt;

&lt;p&gt;The nature of a public blockchain like Ethereum is that all data is replicated on all nodes. When you run a full Ethereum node, you download the entire history of the blockchain from other nodes, starting from block #0 (the &amp;ldquo;genesis block&amp;rdquo;). Those blocks contain every transaction that has ever occurred in Ethereum. In fact, the security of the blockchain relies on the fact that all of these transactions are permanently, immutably, stored.&lt;/p&gt;

&lt;p&gt;Due to the public nature of the Ethereum blockchain, it is impossible for a smart contract to contain truly hidden data. This is doubly true of state variables, because Ethereum provides a simple API to read them! Let&amp;rsquo;s revisit the Counter contract from &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/&#34;&gt;Writing a Contract That Handles Ether&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// persistent contract storage&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the default visibility for state variables in Solidity is &lt;code&gt;internal&lt;/code&gt; (more on that later), so &lt;code&gt;count&lt;/code&gt; is &lt;em&gt;not&lt;/em&gt; public. The &lt;code&gt;getCount&lt;/code&gt; function provides me with an easy way to read it, but even without that function, it&amp;rsquo;s trivial to read. This code using &lt;code&gt;web3.js&lt;/code&gt; (when connected to Ropsten) will do the trick:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.getStorageAt(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;0xf15090c01bec877a122b567e5552504e5fd22b79&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;count)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;console.log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Current count: &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;parseInt&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(count,&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;16&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Output:&lt;/span&gt;
&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Current count: 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;web3.eth.getStorageAt&lt;/code&gt; reads the storage for a contract by direct address lookup. It so happens that statically-sized state variables are laid out in storage starting at address 0, and the variable we&amp;rsquo;re looking for is the first one, so 0 is the correct address. See &lt;a href=&#34;https://solidity.readthedocs.io/en/develop/miscellaneous.html#layout-of-state-variables-in-storage&#34;&gt;Layout of State Variables in Storage&lt;/a&gt; from the Solidity documentation for the details of storage layout. Determining the location of any state variable from the Solidity source is straightforward. Even obfuscated bytecode without the source doesn&amp;rsquo;t make it too hard to find a piece of data.&lt;/p&gt;

&lt;h2 id=&#34;state-variable-visibility-in-solidity&#34;&gt;State Variable Visibility in Solidity&lt;/h2&gt;

&lt;p&gt;If all data is already public, why are there any options for state variable visibility other than &lt;code&gt;public&lt;/code&gt;? To fully answer that question, it&amp;rsquo;s important to differentiate between two frames of reference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An external actor, inspecting the contents of the blockchain.&lt;/li&gt;
&lt;li&gt;Smart contract code, running inside the Ethereum Virtual Machine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;rsquo;ve established that an external actor, including the JavaScript front end for a DApp, can read any data in the blockchain, but marking a state variable as &lt;code&gt;public&lt;/code&gt; makes it considerably easier to access.&lt;/p&gt;

&lt;h3 id=&#34;getters-for-public-state-variables&#34;&gt;Getters for Public State Variables&lt;/h3&gt;

&lt;p&gt;Solidity automatically generates functions for reading public state variables called &amp;ldquo;getters.&amp;rdquo; A getter has the same name as the corresponding state variable and simply returns its value.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Getters are view functions, so they can be called without paying for gas. Here&amp;rsquo;s an updated version of our Counter contract, this time using a &lt;code&gt;public&lt;/code&gt; state variable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;public&lt;/code&gt; keyword indicates that the &lt;code&gt;count&lt;/code&gt; state variable should have a getter. The &lt;code&gt;getCount()&lt;/code&gt; function has been removed because it&amp;rsquo;s no longer needed. The generated function &lt;code&gt;count()&lt;/code&gt; takes its place.&lt;/p&gt;

&lt;p&gt;In my previous post &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/&#34;&gt;Building Decentralized Apps With Ethereum and JavaScript&lt;/a&gt;, I wrote JavaScript to call &lt;code&gt;getCount()&lt;/code&gt;. It can now call &lt;code&gt;count()&lt;/code&gt; instead:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Used to be counter.getCount.call(...)&lt;/span&gt;
&lt;span style=&#34;color: #586e75&#34;&gt;counter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;call&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is just as convenient for a developer as the hand-written &lt;code&gt;getCount()&lt;/code&gt; function, but it requires less code in the smart contract.&lt;/p&gt;

&lt;h3 id=&#34;hiding-data-from-other-contracts&#34;&gt;Hiding Data From Other Contracts&lt;/h3&gt;

&lt;p&gt;Now let&amp;rsquo;s consider our second frame of reference: a contract running inside the Ethereum Virtual Machine. Contracts can only communicate with each other via message passing, and they cannot directly read the storage of another contract. This is analogous to typical object-oriented programming. Although you, the programmer, can run a debugger and inspect anything in memory, at the programming language level, objects are able to enforce the use of a well-defined interface through &lt;a href=&#34;https://en.wikipedia.org/wiki/Information_hiding&#34;&gt;data hiding&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Solidity provides data hiding through the use of &lt;code&gt;private&lt;/code&gt; and &lt;code&gt;internal&lt;/code&gt; visibility. &lt;code&gt;private&lt;/code&gt; variables are only accessible to the declaring contract itself, and &lt;code&gt;internal&lt;/code&gt; variables (the default) are accessible to the declaring contract and any contracts derived from it. &lt;code&gt;public&lt;/code&gt; variables can be read via their getters by any contract.&lt;/p&gt;

&lt;p&gt;Note that this still does not provide security around non-public variables. A developer can easily read the variable and send it to another contract via a transaction. Non-&lt;code&gt;public&lt;/code&gt; variables are more about programming discipline than security.&lt;/p&gt;

&lt;h2 id=&#34;when-to-make-a-state-variable-public&#34;&gt;When to Make a State Variable Public&lt;/h2&gt;

&lt;p&gt;You &lt;em&gt;need&lt;/em&gt; to make state variables public (or write your own getters) if you want other contracts to be able to read them. You &lt;em&gt;should&lt;/em&gt; make state variables public if you want to be able to read them easily from JavaScript or another programming language outside of Ethereum.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All data in the Ethereum blockchain is inherently public.&lt;/li&gt;
&lt;li&gt;State variables are particularly easy to read, regardless of whether they&amp;rsquo;re marked &lt;code&gt;public&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For state variables marked &lt;code&gt;public&lt;/code&gt;, the Solidity compiler generates a getter with the same name.&lt;/li&gt;
&lt;li&gt;Contracts can hide data from each other by using &lt;code&gt;private&lt;/code&gt; and &lt;code&gt;internal&lt;/code&gt; variables, but this does not provide security.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/contracts.html#visibility-and-getters&#34;&gt;Visibility and Getters section&lt;/a&gt; of the Solidity documentation is a great resource for learning more about this topic.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;Getters for &lt;code&gt;array&lt;/code&gt;s and &lt;code&gt;mapping&lt;/code&gt;s take an index parameter and return the specified value. For the full details of how getters work for complex types, see &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/contracts.html#getter-functions&#34;&gt;the Solidity documentation for getters&lt;/a&gt;.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>How Ethereum Transactions Work</title>
      <link>https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/</link>
      <pubDate>Fri, 29 Dec 2017 09:33:18 -0500</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/</guid>
      <description>

&lt;p&gt;&lt;em&gt;[This blog post explains a little bit about how transactions work in Ethereum, but it is &lt;strong&gt;not&lt;/strong&gt; necessary for learning Solidity programming.  We write it for those of you who&amp;rsquo;d like a little deeper understanding of what is going on when a transaction is attempted.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Smart contracts are interesting because of the side-effects they can have&amp;mdash;including transferring ether&amp;mdash;when executing transactions.  How exactly are transactions constructed and sent to the network?&lt;/p&gt;

&lt;h2 id=&#34;sending-a-transaction-to-the-network&#34;&gt;Sending a Transaction to the Network&lt;/h2&gt;

&lt;p&gt;To make any change to the Ethereum blockchain, a transaction must be sent. A transaction is a cryptographically-signed message that specifies what change is to be made, and it is sent to any node in the network. Based on Ethereum&amp;rsquo;s rules of consensus, the network then agrees that the transaction is a valid one, and it is included in a block that is added to the blockchain.&lt;/p&gt;

&lt;p&gt;The message that makes up the transaction is an &lt;a href=&#34;https://github.com/ethereum/wiki/wiki/RLP&#34;&gt;RLP&lt;/a&gt;-encoded array that specifies the details of the transaction. The following values are encoded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;recipient&lt;/strong&gt; &amp;ndash; The account address to which the transaction is being sent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;value&lt;/strong&gt; &amp;ndash; The amount of ether to transfer from the sender to the recipient.  This amount may be zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data&lt;/strong&gt; &amp;ndash; Optional arbitrary binary data. During contract deployment, this is where the contract&amp;rsquo;s bytecode is sent. When calling a function on a contract, this specifies which function should be called and with what arguments. For simple transfers of ether, the data portion of the transaction is typically omitted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gas limit&lt;/strong&gt; &amp;ndash; The maximum amount of gas that can be consumed by the transaction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gas price&lt;/strong&gt; &amp;ndash; The amount the sender will pay for each unit of gas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nonce&lt;/strong&gt; &amp;ndash; A &lt;em&gt;sequence number&lt;/em&gt; called a &amp;ldquo;nonce&amp;rdquo;.  The sequence number is &lt;em&gt;per sender&lt;/em&gt; and must match the next available sequence number exactly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;signature&lt;/strong&gt; &amp;ndash; Data that identifies and authenticates the transaction&amp;rsquo;s sender.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;internal-transactions&#34;&gt;Internal Transactions&lt;/h2&gt;

&lt;p&gt;The above description of a transaction assumes that it originates from an externally owned account&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. In fact, &lt;em&gt;all&lt;/em&gt; Ethereum transactions are sent from externally owned accounts. Contracts can also send ether and invoke functions in other contracts, but this mechanism is properly called a &amp;ldquo;message.&amp;rdquo; Unfortunately, it is often referred to as an &lt;em&gt;internal transaction&lt;/em&gt;, which leads to some confusion.&lt;/p&gt;

&lt;p&gt;A message sent by a contract differs from a true transaction in two ways: it does not include a cryptographic signature, and it is not included directly in the blockchain. Rather, it is part of the side effects of the original transaction that was sent to the contract from an externally owned account.&lt;/p&gt;

&lt;h2 id=&#34;calling-smart-contract-functions&#34;&gt;Calling Smart Contract Functions&lt;/h2&gt;

&lt;p&gt;In Solidity, every public function that can change state is invocable via a transaction.  From the vantage of a programmer, the invocation requires three components: the address of the contract, which function is to be invoked, and the values of the arguments to that function (if any).&lt;/p&gt;

&lt;p&gt;Note that our definition of a transaction makes no (direct) mention of functions or arguments.  That&amp;rsquo;s because the Ethereum Virtual Machine does not have a notion of functions or arguments.  Instead, those are encoded during the compilation process into lower level primitives for the EVM.  The function&amp;rsquo;s signature and its arguments are encoded into the &amp;ldquo;data&amp;rdquo; in the transaction request.  (For more on the encoding details, please explore the resources at the end of this post.)&lt;/p&gt;

&lt;h2 id=&#34;the-nonce&#34;&gt;The Nonce&lt;/h2&gt;

&lt;p&gt;The sequence number &amp;ldquo;nonce&amp;rdquo; is a security measure in the Ethereum system that prevents &lt;a href=&#34;https://en.wikipedia.org/wiki/Replay_attack&#34;&gt;replay attacks&lt;/a&gt; on transactions.  The sequence number is per sender.  The fact that the network requires each subsequent transaction request to have a unique sequence number from all previously executed transactions (from this sender) means that no transaction can be replayed.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All actions that modify the Ethereum blockchain use transactions.&lt;/li&gt;
&lt;li&gt;Transactions addressed to smart contracts include encoded data that identifies what function should be invoked and its arguments (if any).&lt;/li&gt;
&lt;li&gt;Transactions include a promise to pay a limited amount of ether for gas, and they may also include a transfer of ether to the recipient.&lt;/li&gt;
&lt;li&gt;The use of a nonce and a cryptographic signature guarantees that only authorized transactions are performed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fortunately, the support tooling around the Ethereum network hides many of the low-level details from users.  Users, for the most part, can stick with high-level abstractions like contract addresses, function names, argument values, etc.&lt;/p&gt;

&lt;h2 id=&#34;resources&#34;&gt;Resources&lt;/h2&gt;

&lt;p&gt;An excellent, but much more technically detailed, explanation can be found in
&lt;a href=&#34;https://medium.com/@hayeah/how-to-decipher-a-smart-contract-method-call-8ee980311603&#34;&gt;How To Decipher A Smart Contract Method Call&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The definitive explanation is in the
&lt;a href=&#34;http://gavwood.com/paper.pdf&#34;&gt;Yellow Paper&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;&amp;ldquo;Externally owned accounts&amp;rdquo; are accounts typically owned by people. Smart contracts are the the other type of account.  See this &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/06/what-is-a-smart-contract/&#34;&gt;post&lt;/a&gt; for more details.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Checking the Sender in a Smart Contract</title>
      <link>https://programtheblockchain.com/posts/2017/12/26/checking-the-sender-in-a-smart-contract/</link>
      <pubDate>Tue, 26 Dec 2017 10:26:27 -0500</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/26/checking-the-sender-in-a-smart-contract/</guid>
      <description>&lt;p&gt;This article will demonstrate how to write a simple, but complete, smart contract in Solidity that accepts and distributes ether on behalf of the contract&amp;rsquo;s owner.  It assumes that you are comfortable with the ether-handling concepts introduced in our
&lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/&#34;&gt;last Solidity example blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;establishing-a-smart-contract-owner&#34;&gt;Establishing a Smart Contract &amp;ldquo;Owner&amp;rdquo;&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s start with the code from last time:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CommunityChest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The obvious (and unrealistic!) shortcoming of this contract is that anybody can withdraw ether from the contract, so it is of no real use.  The contract needs the notion of an owner account that will be the only account that can withdraw ether.&lt;/p&gt;

&lt;p&gt;Fortunately, every account has a unique address, and it is possible to store addresses persistently and to test for address equality.  Here&amp;rsquo;s the changed code to do that, renamed &amp;ldquo;TipJar&amp;rdquo; because anybody can deposit, but only the owner can withdraw:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// current owner of the contract&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// contract&amp;#39;s constructor function&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// unchanged code omitted&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a quick explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The TipJar contract has a global, persistent value, &lt;code&gt;owner&lt;/code&gt;, that stores the current owner.&lt;/li&gt;
&lt;li&gt;The TipJar contract&amp;rsquo;s constructor sets the initial value of &lt;code&gt;owner&lt;/code&gt; to &lt;code&gt;msg.sender&lt;/code&gt;, which in the case of a constructor is the address of the account that is deploying the contract.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;withdraw()&lt;/code&gt; function now requires that the account requesting the withdraw transaction (&lt;code&gt;msg.sender&lt;/code&gt;) be the current owner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key things to note above are that address of a transaction&amp;rsquo;s sender&amp;rsquo;s account is available to the smart contract (as &lt;code&gt;msg.sender&lt;/code&gt;), and that addresses can be stored and compared just like other scalar values.&lt;/p&gt;

&lt;h2 id=&#34;changing-the-owner&#34;&gt;Changing the Owner&lt;/h2&gt;

&lt;p&gt;An important pattern to enable in smart contracts is making them transferable.  In the case of the TipJar example, that would mean allowing the current owner to transfer ownership to another account:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;    

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;changeOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// unchanged code omitted&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above repeats two patterns from the previous code samples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;require&lt;/code&gt; statement aborts the transaction if any account other than the current owner attempts to change the owner.&lt;/li&gt;
&lt;li&gt;The persistent state variable &lt;code&gt;owner&lt;/code&gt; is updated with the value held in the &lt;code&gt;newOwner&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;creating-new-modifiers&#34;&gt;Creating New Modifiers&lt;/h2&gt;

&lt;p&gt;Solidity has a powerful mechanism for creating custom function &amp;ldquo;modifiers&amp;rdquo;.  Up until now, we&amp;rsquo;ve only used the built-in modifiers &lt;code&gt;public&lt;/code&gt; and &lt;code&gt;view&lt;/code&gt;.  Modifiers allow programmers to summarize boilerplate prologue (and epilogue) code that may appear in many functions.  In the example above, the &lt;code&gt;require(owner == msg.sender)&lt;/code&gt; code is a simple example of such prologue code.  The code below will eliminate that by creating a new &lt;code&gt;ownerOnly&lt;/code&gt; modifier:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;tipjar.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTk7Cgpjb250cmFjdCBUaXBKYXIgewogICAgYWRkcmVzcyBvd25lcjsKCiAgICBtb2RpZmllciBvd25lck9ubHkgewogICAgICAgIHJlcXVpcmUob3duZXIgPT0gbXNnLnNlbmRlcik7CiAgICAgICAgXzsgICAvLyA8LS0tIG5vdGUgdGhlICdfJywgd2hpY2ggcmVwcmVzZW50cyB0aGUgbW9kaWZpZWQgZnVuY3Rpb24ncyBib2R5CiAgICB9CgogICAgZnVuY3Rpb24gVGlwSmFyKCkgcHVibGljIHsgIC8vIGNvbnRyYWN0J3MgY29uc3RydWN0b3IgZnVuY3Rpb24KICAgICAgICBvd25lciA9IG1zZy5zZW5kZXI7CiAgICB9CgogICAgZnVuY3Rpb24gY2hhbmdlT3duZXIoYWRkcmVzcyBuZXdPd25lcikgcHVibGljIG93bmVyT25seSB7CiAgICAgICAgb3duZXIgPSBuZXdPd25lcjsKICAgIH0KCiAgICBmdW5jdGlvbiB3aXRoZHJhdygpIHB1YmxpYyBvd25lck9ubHkgewogICAgICAgIG1zZy5zZW5kZXIudHJhbnNmZXIoYWRkcmVzcyh0aGlzKS5iYWxhbmNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXBvc2l0KHVpbnQyNTYgYW1vdW50KSBwYXlhYmxlIHB1YmxpYyB7CiAgICAgICAgcmVxdWlyZShtc2cudmFsdWUgPT0gYW1vdW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRCYWxhbmNlKCkgcHVibGljIHZpZXcgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJldHVybiBhZGRyZXNzKHRoaXMpLmJhbGFuY2U7CiAgICB9Cn0K&#34; download=&#39;tipjar.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;modifier&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ownerOnly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;   &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// &amp;lt;--- note the &amp;#39;_&amp;#39;, which represents the modified function&amp;#39;s body&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;TipJar&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// contract&amp;#39;s constructor function&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;changeOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ownerOnly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;owner&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;newOwner&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;ownerOnly&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

The code above encompasses the following changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;ownerOnly&lt;/code&gt; modifier is created, which includes the &lt;code&gt;require&lt;/code&gt; statement for checking if the &lt;code&gt;owner&lt;/code&gt; variable is equal to the transaction&amp;rsquo;s sender.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;ownerOnly&lt;/code&gt; modifier&amp;rsquo;s definition includes the &lt;code&gt;_&lt;/code&gt; (underscore) that signifies where the body of the modified function should be substituted.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;changeOwner&lt;/code&gt; and &lt;code&gt;withdraw&lt;/code&gt; functions both now use the &lt;code&gt;ownerOnly&lt;/code&gt; modifier in the function header rather than including the &lt;code&gt;require&lt;/code&gt; statement in their body.  The two alternatives are equivalent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modifier declarations can also include boilerplate code after the underscore, which would then become the epilogue of any functions so decorated.&lt;/p&gt;

&lt;p&gt;Multiple modifiers may be placed on a given function declaration, and all of their boilerplate code will be applied to the function&amp;rsquo;s code.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Account addresses are type &lt;code&gt;address&lt;/code&gt; in Solidity.&lt;/li&gt;
&lt;li&gt;The address of the account sending a transaction is accessible to the contract as &lt;code&gt;msg.sender&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;New function modifiers can be defined, and they can be composed.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Testing and Deploying Smart Contracts with Remix</title>
      <link>https://programtheblockchain.com/posts/2017/12/19/testing-and-deploying-smart-contracts-with-remix/</link>
      <pubDate>Tue, 19 Dec 2017 07:11:31 -0500</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/19/testing-and-deploying-smart-contracts-with-remix/</guid>
      <description>&lt;p&gt;In my post &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/&#34;&gt;Building Decentralized Apps With Ethereum and JavaScript&lt;/a&gt;, I showed how to write a front end for a smart contract that was already deployed to the Ethereum network. This post will cover how that smart contract got deployed. I&amp;rsquo;ll walk you through compiling a smart contract, doing some basic testing, and deploying it to the world.&lt;/p&gt;

&lt;p&gt;There are a number of tools available for compiling, testing, and deploying smart contracts. For this post, I&amp;rsquo;ll use &lt;a href=&#34;https://remix.ethereum.org&#34;&gt;Remix&lt;/a&gt;, which has the advantage of being entirely browser-based. This means you&amp;rsquo;ll be able to compile, deploy, and test smart contracts without installing any local tools.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;compiling-a-smart-contract&#34;&gt;Compiling a Smart Contract&lt;/h2&gt;

&lt;p&gt;In our &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/&#34;&gt;last blog post&lt;/a&gt;, we wrote a simple contract called Counter, which we&amp;rsquo;ll use again here:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// persistent contract storage&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt; 
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; 
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can compile this contract by pasting it into the editor at &lt;a href=&#34;https://remix.ethereum.org&#34;&gt;remix.ethereum.org&lt;/a&gt;.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; By default, Remix automatically compiles your code when it changes, but you can also do it manually by clicking the button labeled &amp;ldquo;Start to compile&amp;rdquo; on the right. If the compiler emits an error or warning, you will see that on the right-hand side.&lt;/p&gt;

&lt;h2 id=&#34;deploying-and-testing-a-smart-contract&#34;&gt;Deploying and Testing a Smart Contract&lt;/h2&gt;

&lt;p&gt;Once you&amp;rsquo;ve compiled a contract in Remix, you can use the &amp;ldquo;run&amp;rdquo; tab to deploy it. The &amp;ldquo;environment&amp;rdquo; drop-down gives three options for where to deploy the contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;JavaScript VM&lt;/strong&gt; - This lets you run your contract directly in the browser using a JavaScript implementation of the Ethereum virtual machine (EVM). This is great for simple testing but doesn&amp;rsquo;t allow anyone else to interact with your contract.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Injected Web3&lt;/strong&gt; - &lt;a href=&#34;https://github.com/ethereum/wiki/wiki/JavaScript-API&#34;&gt;Web3&lt;/a&gt; is the interface for interacting with an Ethereum node.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; If you&amp;rsquo;re using the &lt;a href=&#34;https://metamask.io&#34;&gt;MetaMask&lt;/a&gt; browser extension as described in &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/&#34;&gt;our post about DApps&lt;/a&gt;, it injects an implementation of Web3 into every web page. This option will let you use that injected implementation to deploy to a test network or the main Ethereum network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web3 Provider&lt;/strong&gt; - This option connects directly to an Ethereum node via HTTP. If you&amp;rsquo;re running your own node (or something like &lt;a href=&#34;https://github.com/trufflesuite/ganache-cli&#34;&gt;ganache&lt;/a&gt;), you can use this option to connect to it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For your initial development and testing, the JavaScript VM does everything you&amp;rsquo;ll need. When it&amp;rsquo;s time to deploy your contract to the world, you&amp;rsquo;ll need to use one of the other options.&lt;/p&gt;

&lt;p&gt;Pick the JavaScript VM environment, enter an initial count next to the &amp;ldquo;Create&amp;rdquo; button, and then click &amp;ldquo;Create&amp;rdquo; to deploy the contract. You should see a line appear like &lt;code&gt;browser/Counter.sol:Counter at 0x...&lt;/code&gt;. This indicates that your contract was deployed and has an address. Below that line, a list of public functions will appear. You can call a function by clicking on it. This allows for some basic in-browser testing.&lt;/p&gt;


&lt;figure&gt;
    &lt;a href=&#34;https://programtheblockchain.com/images/remix-run-tab.png&#34;&gt;
        &lt;img src=&#34;https://programtheblockchain.com/images/remix-run-tab.png&#34; width=&#34;75%&#34; /&gt;
    &lt;/a&gt;
    
&lt;/figure&gt;


&lt;h2 id=&#34;sharing-your-deployed-contract-with-others&#34;&gt;Sharing Your Deployed Contract with Others&lt;/h2&gt;

&lt;p&gt;For someone to interact with your contract, they need to know two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The address of the deployed contract.&lt;/li&gt;
&lt;li&gt;The contract&amp;rsquo;s &lt;a href=&#34;http://solidity.readthedocs.io/en/develop/abi-spec.html&#34;&gt;Application Binary Interface (ABI)&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You&amp;rsquo;ll get an address when you deploy your contract to a public network&amp;ndash;either a test network or the main Ethereum network. When using Remix, a good way to do that is to deploy using MetaMask by choosing the &amp;ldquo;Injected Web3&amp;rdquo; environment.&lt;/p&gt;

&lt;p&gt;The line that appears when your contract has been deployed has a clipboard icon on the right. (You may need to expand the right-hand panel to make that icon visible.) Clicking that icon will copy the contract&amp;rsquo;s address to your clipboard. Here&amp;rsquo;s an address where I deployed the above contract on the &lt;a href=&#34;https://github.com/ethereum/ropsten&#34;&gt;Ropsten test network&lt;/a&gt;&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0xf15090c01bec877a122b567e5552504e5fd22b79&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The ABI is what tells callers what functions are available, what arguments they take, and what they return. The ABI is generated for you by the Solidity compiler, and Remix exposes it from the &amp;ldquo;Compile&amp;rdquo; tab. Click &amp;ldquo;Details&amp;rdquo; next to your contract, and then click the clipboard icon next to &amp;ldquo;INTERFACE - ABI&amp;rdquo; to copy the interface to your clipboard. The ABI should be something like this (formatted for readability):&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[],&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;getCount&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;outputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;payable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;stateMutability&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;view&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;function&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[],&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;increment&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;outputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[],&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;payable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;stateMutability&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;nonpayable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;function&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;_count&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;],&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;payable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;stateMutability&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;nonpayable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;constructor&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Remix is a browser-based development tool for smart contracts.&lt;/li&gt;
&lt;li&gt;Remix supports compiling smart contracts in the browser.&lt;/li&gt;
&lt;li&gt;Remix provides a JavaScript implementation of the Ethereum virtual machine which can be used for simple testing.&lt;/li&gt;
&lt;li&gt;Remix can also deploy to a test network or the main Ethereum network.&lt;/li&gt;
&lt;li&gt;Remix exports your contract&amp;rsquo;s Application Binary Interface, which is consumed by code that interacts with your contract.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;The first time you use Remix, it populates the editor with an example contract. You can simply replace that code, or you can delete that file altogether and add a new one.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;The Ethereum network is made up of &amp;ldquo;nodes&amp;rdquo; which store and update the blockchain via a consensus protocol. All interactions with the blockchain involve communicating with one of these nodes.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:2&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;To deploy to the Ropsten test network, you&amp;rsquo;ll need ether in an account there to pay for gas. Ether on a test network has no real monetary value because it&amp;rsquo;s extremely easy to mine. You can fund your Ropsten account for free via &lt;a href=&#34;https://faucet.metamask.io&#34;&gt;the MetaMask faucet&lt;/a&gt;.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:3&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Be Careful When Using the Solidity Fallback Function</title>
      <link>https://programtheblockchain.com/posts/2017/12/16/be-careful-when-using-the-solidity-fallback-function/</link>
      <pubDate>Sat, 16 Dec 2017 04:46:36 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/16/be-careful-when-using-the-solidity-fallback-function/</guid>
      <description>&lt;p&gt;This post will discuss Solidity&amp;rsquo;s anonymous &amp;ldquo;fallback function&amp;rdquo;, which is a commonly used mechanism for accepting ether transfers.  This post expands a topic briefly mentioned in the post, &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/&#34;&gt;Writing a Contract That Handles Ether&lt;/a&gt;.

Below, we explain what this function does and why we encourage caution when using it.&lt;/p&gt;

&lt;p&gt;A smart contract developed with Solidity has an
&lt;a href=&#34;http://solidity.readthedocs.io/en/develop/abi-spec.html&#34;&gt;Application Binary Interface&lt;/a&gt;
(ABI) that describes the public functions exposed by that smart contract.  This ABI enables others to determine how to send a properly formatted transaction to a public function of a smart contract with confidence that the transaction will result in the proper code being executed.  Each public function has a function selector, which is encoded as a 4-byte address within the contract.  The prologue code in a smart contract checks the transaction&amp;rsquo;s function selector for validity and transfers execution to the appropriate function.&lt;/p&gt;

&lt;h2 id=&#34;transactions-without-valid-function-selectors&#34;&gt;Transactions Without Valid Function Selectors&lt;/h2&gt;

&lt;p&gt;What happens if a transaction doesn&amp;rsquo;t include an expected function selector?  Solidity allows programmers to specify a parameterless, anonymous &amp;ldquo;fallback function&amp;rdquo; that will handle every transaction attempted on a nonexistent function selector.  (The term &amp;ldquo;fallback&amp;rdquo; here refers to the idea that if the contract doesn&amp;rsquo;t know what to do with a given transaction&amp;rsquo;s function selector, it will &amp;ldquo;fall back&amp;rdquo; on executing this function.)&lt;/p&gt;

&lt;p&gt;There are some very advanced applications of such a fallback function, but there is one simple and common use&amp;mdash;to allow trivial transactions to transfer ether to a smart contract:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;19&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Fallback&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nothing to do&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a quick explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;function()&lt;/code&gt; represents an anonymous, parameterless fallback function.&lt;/li&gt;
&lt;li&gt;Because of the &lt;code&gt;payable&lt;/code&gt; modifier, it can accept ether.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A payable fallback function to accept an ether transfer is a very common pattern in Solidity programs.&lt;/p&gt;

&lt;h2 id=&#34;fallback-functions-can-be-dangerous&#34;&gt;Fallback Functions Can Be Dangerous&lt;/h2&gt;

&lt;p&gt;It is possible to put code in the body of this function, but it&amp;rsquo;s generally considered bad practice to put anything beyond very short, simple logic.  The reason is important and unique to smart contracts: you don&amp;rsquo;t want this function to fail because it runs out of gas.  This is a concern because many account-to-account direct transfers of ether are given a default amount of gas, which is actually quite small.  To avoid running out of gas, it&amp;rsquo;s important that the function&amp;rsquo;s code use less gas than this default amount. As a rule of thumb, you will have just enough gas to log an event, but not enough to write data to storage.&lt;/p&gt;

&lt;p&gt;Payable fallback functions may also be dangerous to anybody who attaches ether to a transaction on the wrong account.  For instance, imagine attaching ether to a &amp;ldquo;bid&amp;rdquo; transaction mistakenly sent to account 0x123 when it was supposed to go to account 0x789. If the contract at 0x123 has a payable fallback function, the sender will likely have no way to recover that ether.  If account 0x123 did not have a payable fallback function, this transaction would have simply failed, and no damage would have been done.&lt;/p&gt;

&lt;p&gt;When you can dictate to callers what function they call, like when building a DApp, you should avoid the fallback function. You should instead use a named function like &lt;code&gt;buy()&lt;/code&gt;, &lt;code&gt;bid()&lt;/code&gt;, or &lt;code&gt;deposit()&lt;/code&gt; to help avoid costly mistakes by consumers.&lt;/p&gt;

&lt;h2 id=&#34;when-is-a-fallback-function-necessary&#34;&gt;When Is a Fallback Function Necessary?&lt;/h2&gt;

&lt;p&gt;Unfortunately, it may be necessary for a smart contract to assume account-to-account transfers will be done with direct transfers that require a fallback function.  This is because the transferring account may need to make transfers to both Externally-Owned Accounts (EOAs) and to other smart contracts.  EOAs can &lt;em&gt;only&lt;/em&gt; accept direct transfers, so the transferring account must use use direct transfers.  This means that any contract that wants to accept such transfers must be prepared for direct transfers by having a fallback function.  Without that function, the transfer would fail, and it would be impossible for the contract to accept ether from the other contract.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Contracts can accept direct ether transfers with the payable fallback function, &lt;code&gt;function() payable&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When possible, it&amp;rsquo;s best to avoid including a payable fallback function. This helps to prevent people from sending ether to your contract by mistake.&lt;/li&gt;
&lt;li&gt;When a contract has to act the same as an EOA in terms of accepting ether (e.g. when it&amp;rsquo;s going to &amp;ldquo;withdraw&amp;rdquo; ether from another contract), then it needs to have a payable fallback function to accept the ether.&lt;/li&gt;
&lt;li&gt;The fallback function is often invoked as a simple transfer with very limited gas, so minimize how much code your fallback function includes.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Writing a Contract That Handles Ether</title>
      <link>https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/</link>
      <pubDate>Fri, 15 Dec 2017 15:13:40 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/</guid>
      <description>&lt;p&gt;This post will demonstrate how to write a simple, but complete, smart contract in Solidity that accepts and distributes ether.  It assumes that you have read our previous post, &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/&#34;&gt;Writing a Very Simple Smart Contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;accounts-own-ether&#34;&gt;Accounts Own Ether&lt;/h2&gt;

&lt;p&gt;Both kinds of Ethereum accounts (smart contracts and Externally-Owned Accounts) can own ether.  Given an account&amp;rsquo;s address, its current ether balance can be accessed in Solidity as &lt;code&gt;&lt;em&gt;address&lt;/em&gt;.balance&lt;/code&gt;.  A smart contract can access its own balance as &lt;code&gt;address(this).balance&lt;/code&gt;.  The following contract&amp;rsquo;s &lt;code&gt;getBalance()&lt;/code&gt; function returns the current balance of ether that it owns:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CommunityChest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While &lt;code&gt;getBalance&lt;/code&gt; demonstrates the use of &lt;code&gt;address(this).balance&lt;/code&gt;, the function is not strictly necessary because it&amp;rsquo;s always possible for anybody (or any smart contract) to directly access another account&amp;rsquo;s ether balance using that other account&amp;rsquo;s address.&lt;/p&gt;

&lt;h2 id=&#34;deposit&#34;&gt;Deposit&lt;/h2&gt;

&lt;p&gt;To allow other accounts to deposit and withdraw ether from this smart contract, we will add a couple of routines.  Let&amp;rsquo;s start with a &lt;code&gt;deposit()&lt;/code&gt; function that deposits ether:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CommunityChest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nothing to do!&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a quick explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;payable&lt;/code&gt; modifier represents the ability of this &lt;code&gt;deposit()&lt;/code&gt; function to accept the ether that the message&amp;rsquo;s sender attached to a transaction message.&lt;/li&gt;
&lt;li&gt;The function requires no explicit action to accept the attached ether&amp;mdash;attached ether is implicitly transferred to the smart contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of the implicit transfer, the &lt;code&gt;deposit()&lt;/code&gt; function is surprisingly simple.&lt;/p&gt;

&lt;p&gt;While &lt;code&gt;deposit()&lt;/code&gt; can be trivially implemented like it was above, it&amp;rsquo;s a better practice to have the function take as a parameter the amount to be transferred and then to test that that&amp;rsquo;s the actual amount transferred.  This allows the contract to reject transactions that may be erroneous:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CommunityChest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nothing else to do!&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a quick explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msg.value&lt;/code&gt; represents the ether that the message&amp;rsquo;s sender attached to a transaction message.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require(msg.value == amount);&lt;/code&gt; tests that the amount attached to the message (&lt;code&gt;msg.value&lt;/code&gt;) is the amount that the sender passed as an argument.  If a &lt;code&gt;require&lt;/code&gt; fails, then the whole transaction fails and there are no side effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last bullet highlights a fundamental design choice for contracts&amp;mdash;each transaction either completes fully with all the state changes logged, or the transaction is aborted with absolutely no side effects.  This pattern is exploited repeatedly when developing more complex contracts.&lt;/p&gt;

&lt;h2 id=&#34;withdraw&#34;&gt;Withdraw&lt;/h2&gt;

&lt;p&gt;One important property of smart contracts is that there is absolutely no way to withdraw ether from a contract other than through execution of some function that the contract exposes.  There are no &amp;ldquo;backdoors&amp;rdquo; that can allow the contract author or deployer to withdraw ether without going through the contract&amp;rsquo;s exposed functions.  This is one fundamental reason why a well-written contract can be trusted to handle ether on behalf of users&amp;mdash;the users can see the code and, therefore, the means by which owned ether will be used by the contract.&lt;/p&gt;

&lt;p&gt;So, let&amp;rsquo;s implement a simple &lt;code&gt;withdraw()&lt;/code&gt; function that will withdraw all the contract&amp;rsquo;s ether and give it to whatever account calls the &lt;code&gt;withdraw()&lt;/code&gt; function:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;community.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTc7Cgpjb250cmFjdCBDb21tdW5pdHlDaGVzdCB7CiAgICBmdW5jdGlvbiB3aXRoZHJhdygpIHB1YmxpYyB7CiAgICAgICAgbXNnLnNlbmRlci50cmFuc2ZlcihhZGRyZXNzKHRoaXMpLmJhbGFuY2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlcG9zaXQodWludDI1NiBhbW91bnQpIHBheWFibGUgcHVibGljIHsKICAgICAgICByZXF1aXJlKG1zZy52YWx1ZSA9PSBhbW91bnQpOwogICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBkbyEKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRCYWxhbmNlKCkgcHVibGljIHZpZXcgcmV0dXJucyAodWludDI1NikgewogICAgICAgIHJldHVybiBhZGRyZXNzKHRoaXMpLmJhbGFuY2U7CiAgICB9Cn0K&#34; download=&#39;community.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;CommunityChest&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;withdraw&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;transfer&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;deposit&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #586e75&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;amount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nothing else to do!&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getBalance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;balance&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Here&amp;rsquo;s a quick explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msg.sender&lt;/code&gt; represents the address of the account that initiated this transaction.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;em&gt;address&lt;/em&gt;.transfer(&lt;em&gt;amount&lt;/em&gt;)&lt;/code&gt; transfers  &lt;em&gt;amount&lt;/em&gt;  (in ether) to the account represented by &lt;em&gt;address&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code above illustrates that transferring ether from a contract to another account is done with a single call to &lt;code&gt;transfer(amount)&lt;/code&gt;.  Of course, the contract must own an adequate supply of ether to make the requested transfer; otherwise, the system will abort the transaction.&lt;/p&gt;

&lt;h2 id=&#34;transfer-vs-send&#34;&gt;&lt;code&gt;transfer()&lt;/code&gt; &lt;em&gt;vs&lt;/em&gt; &lt;code&gt;send()&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;In addition to the &lt;code&gt;transfer()&lt;/code&gt; function for transferring ether, Solidity also offers a &lt;code&gt;send()&lt;/code&gt; function.  We discourage using &lt;code&gt;send()&lt;/code&gt;, however, because it can be a little dangerous to use.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;transfer()&lt;/code&gt; encounters a problem, it will raise an exception, which will cause the transaction to abort.  This will typically only happen if the transfer ran out of gas (as described in the previous section).  Aborting the transaction under this circumstance is good/safe because you probably don&amp;rsquo;t want the transaction to complete under the false assumption that it has actually transferred ether.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;send()&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; depending on whether it succeeded or failed in transferring ether, but it never aborts.  If the smart contract does not check the return value, or if it does not correctly handle failure, the smart contract may get into an inconsistent (and irreparable) state.  Therefore, we encourage the use of &lt;code&gt;transfer()&lt;/code&gt; over &lt;code&gt;send()&lt;/code&gt; for transferring ether out of a smart contract.&lt;/p&gt;

&lt;h2 id=&#34;solidity-s-fallback-function&#34;&gt;Solidity&amp;rsquo;s &amp;ldquo;Fallback Function&amp;rdquo;&lt;/h2&gt;

&lt;p&gt;Solidity has a novel construct called a &amp;ldquo;fallback function&amp;rdquo;, which is also used by smart contracts to accept ether transfers.  Note the lack of a function name in the following code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;payable&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// nothing to do&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While this is a commonly used construct, we discourage its use, so we will not demonstrate it further here.
&lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/16/be-careful-when-using-the-solidity-fallback-function/&#34;&gt;Be Careful When Using the Solidity Fallback Function&lt;/a&gt; explains why.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum smart contracts can accept ether transfers in and make ether transfers out.&lt;/li&gt;
&lt;li&gt;Contracts can access their current ether balance with &lt;code&gt;address(this).balance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Contract functions require the &lt;code&gt;payable&lt;/code&gt; modifier to accept transfers in.&lt;/li&gt;
&lt;li&gt;Contract can determine the amount of ether attached to an invocation using &lt;code&gt;msg.value&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Contracts can transfer ether out using the &lt;code&gt;transfer(amount)&lt;/code&gt; function.  Contracts can also use the &lt;code&gt;send(amount)&lt;/code&gt; function, but one should be careful to check its return value and to take the appropriate actions if it fails.&lt;/li&gt;
&lt;li&gt;Contracts can accept direct ether transfers with the fallback function &lt;code&gt;function() payable&lt;/code&gt;.  We discourage its use, however.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Building Decentralized Apps With Ethereum and JavaScript</title>
      <link>https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/</link>
      <pubDate>Wed, 13 Dec 2017 08:26:31 -0500</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/13/building-decentralized-apps-with-ethereum-and-javascript/</guid>
      <description>&lt;p&gt;For users to be able to interact with a smart contract, they need some sort of user interface. The standard means of providing this interface in Ethereum is called a &amp;ldquo;decentralized app.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;In this post, I&amp;rsquo;ll walk through the process of creating a simple decentralized app. Specifically, I&amp;rsquo;ll be building the &lt;a href=&#34;https://programtheblockchain.com/dapps/counter/&#34;&gt;Counter Example DApp&lt;/a&gt;. The code for the smart contract can be found in our post &lt;a href=&#34;https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/&#34;&gt;Writing a Very Simple Smart Contract&lt;/a&gt;. The decentralized app has two buttons, corresponding to the contract&amp;rsquo;s two functions: &lt;code&gt;getCount&lt;/code&gt; and &lt;code&gt;increment&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To follow along with this post, you&amp;rsquo;ll need to be familiar with the basics of smart contracts and building web apps with HTML and JavaScript.&lt;/p&gt;

&lt;h2 id=&#34;what-is-a-decentralized-app&#34;&gt;What Is a Decentralized App?&lt;/h2&gt;

&lt;p&gt;In a traditional web application, a browser-based user interface talks to a server-side back end. This back end creates a point of centralization. The back end can only be trusted to the extent that its owner is trusted.&lt;/p&gt;

&lt;p&gt;In Ethereum, a &lt;strong&gt;decentralized app&lt;/strong&gt; (DApp or ÐApp) replaces that centralized back end with one or more smart contracts, which run in a distributed fashion on the blockchain. The browser-based user interface uses a &lt;a href=&#34;https://github.com/ethereum/wiki/wiki/JavaScript-API&#34;&gt;JavaScript API called Web3&lt;/a&gt; to interact with smart contracts.&lt;/p&gt;

&lt;h2 id=&#34;web3-js-installation&#34;&gt;Web3.js Installation&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;https://github.com/ethereum/web3.js&#34;&gt;web3.js documentation&lt;/a&gt; describes a few options for including the library in your project, depending on what tools you prefer. Feel free to use any of those mechanisms, but for the app we&amp;rsquo;re looking at in this post, I simply downloaded a copy of &lt;a href=&#34;https://github.com/ethereum/web3.js/blob/develop/dist/web3.min.js&#34;&gt;web3.min.js&lt;/a&gt; and included it via a script tag:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;src=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;/path/to/web3.min.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;connecting-to-a-node&#34;&gt;Connecting to a Node&lt;/h2&gt;

&lt;p&gt;To perform any actions that require the blockchain, a decentralized app needs to communicate with an Ethereum node. &lt;code&gt;Web3&lt;/code&gt; is the class the app will use to make API calls. To use it, the app needs to create an instance using a &amp;ldquo;provider.&amp;rdquo; An example of a provider is the &lt;code&gt;HttpProvider&lt;/code&gt;, which lets the app connect directly to a node. You may run your own Ethereum node or use a public node like those provided by &lt;a href=&#34;https://infura.io/&#34;&gt;Infura&lt;/a&gt;, but the most common way users connect to an Ethereum node is via a browser extension called &lt;a href=&#34;https://metamask.io&#34;&gt;MetaMask&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;MetaMask implements a &lt;code&gt;Web3&lt;/code&gt; provider that communicates with the browser extension, which in turn sends API calls to whatever node the user has chosen. (By default, this will be Infura.) It may seem counterintuitive to use an intermediary like MetaMask rather than communicating directly with a node, but MetaMask performs an important function: it keeps a user&amp;rsquo;s private key secure. Ethereum transactions need to be signed with an account&amp;rsquo;s private key, but allowing an app unfettered access to that private key would mean that a malicious app could drain a user&amp;rsquo;s account. Instead, MetaMask intercepts each operation that requires a signature, prompts the user to approve that operation, and then creates the signature using the user&amp;rsquo;s private key. This way, the user is in full control of how their private key is used.&lt;/p&gt;

&lt;p&gt;MetaMask injects a global &lt;code&gt;web3&lt;/code&gt; variable, but newer versions of &lt;code&gt;web3.js&lt;/code&gt; discourage use of this global variable directly because it makes it difficult to use more than one &lt;code&gt;Web3&lt;/code&gt; instance on the same page. Instead, the app can create a new &lt;code&gt;Web3&lt;/code&gt; instance itself using the global instance&amp;rsquo;s provider. The Counter Example DApp waits for jQuery&amp;rsquo;s &lt;code&gt;ready&lt;/code&gt; event to make sure MetaMask has had a chance to inject &lt;code&gt;web3&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// equivalent to $(document).ready(...)&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;typeof&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(web3)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;undefined&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;error(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Unable to find web3. &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
          &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Please run MetaMask (or something else that injects web3).&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Found injected web3.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;web3&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;Web3(&lt;/span&gt;&lt;span style=&#34;color: #268bd2&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.web3.currentProvider);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;...&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;   
&lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After creating the &lt;code&gt;Web3&lt;/code&gt; instance, the app further tests to make sure the user is connected to the expected network. This is especially important for this app, because the backing smart contract is deployed on the &lt;a href=&#34;https://github.com/ethereum/ropsten&#34;&gt;Ropsten test network&lt;/a&gt;&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, not the main Ethereum network:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(web3.version.network&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;error(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Wrong network detected. Please switch to the Ropsten test network.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Connected to the Ropsten test network.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&#34;interacting-with-a-contract&#34;&gt;Interacting With a Contract&lt;/h2&gt;

&lt;p&gt;To interact with a deployed smart contract, an app needs to have two things: the contract&amp;rsquo;s address and its interface (ABI). The address identifies where the contract can be found, and the ABI describes the available functions and events. We&amp;rsquo;ll explore the deployment process in a future post, but I&amp;rsquo;ve already deployed the Counter smart contract on the Ropsten test network and will simply use the address and ABI I obtained when I did that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0xf15090c01bec877a122b567e5552504e5fd22b79&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;abi&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[{&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:[],&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;getCount&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;...;&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.contract(abi).at(address);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The return value of &lt;code&gt;web3.eth.contract(...).at(...)&lt;/code&gt; is an object that has members corresponding to each of the functions in the provided ABI. How the app invokes those functions depends on whether or not they are view functions.&lt;/p&gt;

&lt;h2 id=&#34;calling-view-functions&#34;&gt;Calling View Functions&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;View functions&lt;/em&gt; (also known as &lt;em&gt;constant functions&lt;/em&gt;) in a smart contract do not mutate state. Because of this, the result of calling a view function can be computed by any node and does not require sending a transaction to the blockchain. This makes view function calls fast and free (requiring no gas).&lt;/p&gt;

&lt;p&gt;In our Counter contract, the &lt;code&gt;getCount&lt;/code&gt; function retrieves the current count without mutating any state. It&amp;rsquo;s a view function, so the app can call it without performing a blockchain transaction using the &lt;code&gt;.call&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;counter.getCount.call(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;getCount call executed successfully.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Use the function&amp;#39;s return value&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you try the &lt;a href=&#34;https://programtheblockchain.com/dapps/counter/&#34;&gt;Counter Example DApp&lt;/a&gt;, you&amp;rsquo;ll note that clicking the &amp;ldquo;Get current count&amp;rdquo; button does not require further user interaction, because there&amp;rsquo;s no transaction for the user to approve.&lt;/p&gt;

&lt;h2 id=&#34;sending-transactions&#34;&gt;Sending Transactions&lt;/h2&gt;

&lt;p&gt;As opposed to view functions, functions which mutate state require sending a transaction to the blockchain and waiting for confirmation. In the Counter contract, the &lt;code&gt;increment&lt;/code&gt; function, as the name suggests, mutates the contract&amp;rsquo;s state by incrementing the count. Because it is not a view function, calling it requires sending a transaction to the blockchain and attaching gas via the &lt;code&gt;.sendTransaction&lt;/code&gt; function. MetaMask will prompt the user to approve the transaction, including the attached gas and suggested gas price.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;counter.increment.sendTransaction(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Transaction succeeded.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The callback receives a &amp;ldquo;transaction hash,&amp;rdquo; which can be used to wait for the transaction to be confirmed by the blockchain. This is accomplished via the following &lt;code&gt;waitForReceipt&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;cb)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.getTransactionReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Transaction went through&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(cb)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;cb(receipt);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Try again in 1 second&lt;/span&gt;
      &lt;span style=&#34;color: #268bd2&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.setTimeout(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;cb);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Because it requires a transaction, you&amp;rsquo;ll notice that if you click the &amp;ldquo;Increment count&amp;rdquo; button in the &lt;a href=&#34;https://programtheblockchain.com/dapps/counter/&#34;&gt;Counter Example DApp&lt;/a&gt;, MetaMask prompts the user to first approve the transaction.&lt;/p&gt;

&lt;h2 id=&#34;full-dapp&#34;&gt;Full DApp&lt;/h2&gt;

&lt;p&gt;You can try the Counter Example DApp &lt;a href=&#34;https://programtheblockchain.com/dapps/counter/&#34;&gt;here&lt;/a&gt;. You&amp;rsquo;ll need an account on the Ropsten test network, which you can fund via the &lt;a href=&#34;https://faucet.metamask.io/&#34;&gt;MetaMask faucet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Below is the full source code for the DApp:&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;counter.html&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,PHNjcmlwdCBzcmM9Ii9qcy93ZWIzLm1pbi5qcyI&amp;#43;PC9zY3JpcHQ&amp;#43;CjxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMy4yLjEubWluLmpzIj48L3NjcmlwdD4KCjxwPkN1cnJlbnQgY291bnQ6IDxzcGFuIGlkPSJjb3VudCI&amp;#43;Pz88L3NwYW4&amp;#43;PC9wPgo8YnV0dG9uIGlkPSJnZXRjb3VudCI&amp;#43;R2V0IGN1cnJlbnQgY291bnQ8L2J1dHRvbj4KPGJ1dHRvbiBpZD0iaW5jcmVtZW50Ij5JbmNyZW1lbnQgY291bnQ8L2J1dHRvbj4KPGRpdiBpZD0ibG9nIj48L2Rpdj4KCjxzY3JpcHQ&amp;#43;CiAgZnVuY3Rpb24gbG9nKG1lc3NhZ2UpIHsKICAgICQoJyNsb2cnKS5hcHBlbmQoJCgnPHA&amp;#43;JykudGV4dChtZXNzYWdlKSk7CiAgICAkKCcjbG9nJykuc2Nyb2xsVG9wKCQoJyNsb2cnKS5wcm9wKCdzY3JvbGxIZWlnaHQnKSk7CiAgfQoKICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7CiAgICAkKCcjbG9nJykuYXBwZW5kKCQoJzxwPicpLmFkZENsYXNzKCdkYXJrLXJlZCcpLnRleHQobWVzc2FnZSkpOwogICAgJCgnI2xvZycpLnNjcm9sbFRvcCgkKCcjbG9nJykucHJvcCgnc2Nyb2xsSGVpZ2h0JykpOwogIH0KCiAgZnVuY3Rpb24gd2FpdEZvclJlY2VpcHQoaGFzaCwgY2IpIHsKICAgIHdlYjMuZXRoLmdldFRyYW5zYWN0aW9uUmVjZWlwdChoYXNoLCBmdW5jdGlvbiAoZXJyLCByZWNlaXB0KSB7CiAgICAgIGlmIChlcnIpIHsKICAgICAgICBlcnJvcihlcnIpOwogICAgICB9CgogICAgICBpZiAocmVjZWlwdCAhPT0gbnVsbCkgewogICAgICAgIC8vIFRyYW5zYWN0aW9uIHdlbnQgdGhyb3VnaAogICAgICAgIGlmIChjYikgewogICAgICAgICAgY2IocmVjZWlwdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRyeSBhZ2FpbiBpbiAxIHNlY29uZAogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHdhaXRGb3JSZWNlaXB0KGhhc2gsIGNiKTsKICAgICAgICB9LCAxMDAwKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2YXIgYWRkcmVzcyA9ICIweGYxNTA5MGMwMWJlYzg3N2ExMjJiNTY3ZTU1NTI1MDRlNWZkMjJiNzkiOwogIHZhciBhYmkgPSBbeyJjb25zdGFudCI6dHJ1ZSwiaW5wdXRzIjpbXSwibmFtZSI6ImdldENvdW50Iiwib3V0cHV0cyI6W3sibmFtZSI6IiIsInR5cGUiOiJ1aW50MjU2In1dLCJwYXlhYmxlIjpmYWxzZSwic3RhdGVNdXRhYmlsaXR5IjoidmlldyIsInR5cGUiOiJmdW5jdGlvbiJ9LHsiY29uc3RhbnQiOmZhbHNlLCJpbnB1dHMiOltdLCJuYW1lIjoiaW5jcmVtZW50Iiwib3V0cHV0cyI6W10sInBheWFibGUiOmZhbHNlLCJzdGF0ZU11dGFiaWxpdHkiOiJub25wYXlhYmxlIiwidHlwZSI6ImZ1bmN0aW9uIn0seyJpbnB1dHMiOlt7Im5hbWUiOiJfY291bnQiLCJ0eXBlIjoidWludDI1NiJ9XSwicGF5YWJsZSI6ZmFsc2UsInN0YXRlTXV0YWJpbGl0eSI6Im5vbnBheWFibGUiLCJ0eXBlIjoiY29uc3RydWN0b3IifV07CgogICQoZnVuY3Rpb24gKCkgewogICAgdmFyIGNvdW50ZXI7CgogICAgJCgnI2dldGNvdW50JykuY2xpY2soZnVuY3Rpb24gKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgbG9nKCJDYWxsaW5nIGdldENvdW50Li4uIik7CgogICAgICBjb3VudGVyLmdldENvdW50LmNhbGwoZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgcmV0dXJuIGVycm9yKGVycik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxvZygiZ2V0Q291bnQgY2FsbCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgQmlnTnVtYmVyIG9iamVjdAogICAgICAgICQoJyNjb3VudCcpLnRleHQocmVzdWx0LnRvU3RyaW5nKCkpOwogICAgICB9KTsKICAgIH0pOwoKICAgICQoJyNpbmNyZW1lbnQnKS5jbGljayhmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICBpZih3ZWIzLmV0aC5kZWZhdWx0QWNjb3VudCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIGVycm9yKCJObyBhY2NvdW50cyBmb3VuZC4gSWYgeW91J3JlIHVzaW5nIE1ldGFNYXNrLCAiICsKICAgICAgICAgICAgICAgICAgICAgInBsZWFzZSB1bmxvY2sgaXQgZmlyc3QgYW5kIHJlbG9hZCB0aGUgcGFnZS4iKTsKICAgICAgfQoKICAgICAgbG9nKCJDYWxsaW5nIGluY3JlbWVudC4uLiIpOwoKICAgICAgY291bnRlci5pbmNyZW1lbnQuc2VuZFRyYW5zYWN0aW9uKGZ1bmN0aW9uIChlcnIsIGhhc2gpIHsKICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICByZXR1cm4gZXJyb3IoZXJyKTsKICAgICAgICB9CgogICAgICAgIHdhaXRGb3JSZWNlaXB0KGhhc2gsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGxvZygiVHJhbnNhY3Rpb24gc3VjY2VlZGVkLiAiICsKICAgICAgICAgICAgICAiQ2FsbCBnZXRDb3VudCBhZ2FpbiB0byBzZWUgdGhlIGxhdGVzdCBjb3VudC4iKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBpZiAodHlwZW9mKHdlYjMpID09PSAidW5kZWZpbmVkIikgewogICAgICBlcnJvcigiVW5hYmxlIHRvIGZpbmQgd2ViMy4gIiArCiAgICAgICAgICAgICJQbGVhc2UgcnVuIE1ldGFNYXNrIChvciBzb21ldGhpbmcgZWxzZSB0aGF0IGluamVjdHMgd2ViMykuIik7CiAgICB9IGVsc2UgewogICAgICBsb2coIkZvdW5kIGluamVjdGVkIHdlYjMuIik7CiAgICAgIHdlYjMgPSBuZXcgV2ViMyh3ZWIzLmN1cnJlbnRQcm92aWRlcik7CiAgICAgIGlmICh3ZWIzLnZlcnNpb24ubmV0d29yayAhPSAzKSB7CiAgICAgICAgZXJyb3IoIldyb25nIG5ldHdvcmsgZGV0ZWN0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gdGhlIFJvcHN0ZW4gdGVzdCBuZXR3b3JrLiIpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvZygiQ29ubmVjdGVkIHRvIHRoZSBSb3BzdGVuIHRlc3QgbmV0d29yay4iKTsKICAgICAgICBjb3VudGVyID0gd2ViMy5ldGguY29udHJhY3QoYWJpKS5hdChhZGRyZXNzKTsKICAgICAgICAkKCcjZ2V0Y291bnQnKS5jbGljaygpOwogICAgICB9CiAgICB9CiAgfSk7Cjwvc2NyaXB0Pgo=&#34; download=&#39;counter.html&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;src=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;/js/web3.min.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;src=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;https://code.jquery.com/jquery-3.2.1.min.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;Current count: &lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;id=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;count&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;??&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;span&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;id=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;getcount&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;Get current count&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;button&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;id=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;increment&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;Increment count&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;button&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;id=&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;log&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;

&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;log(message)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#log&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).append($(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;&amp;lt;p&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).text(message));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#log&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).scrollTop($(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#log&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).prop(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;scrollHeight&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(message)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#log&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).append($(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;&amp;lt;p&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).addClass(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;dark-red&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).text(message));&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#log&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).scrollTop($(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#log&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).prop(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;scrollHeight&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;));&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;cb)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.getTransactionReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;receipt)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(receipt&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Transaction went through&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(cb)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;cb(receipt);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// Try again in 1 second&lt;/span&gt;
        &lt;span style=&#34;color: #268bd2&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.setTimeout(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;cb);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;address&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;0xf15090c01bec877a122b567e5552504e5fd22b79&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;abi&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;[{&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:[],&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;getCount&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;outputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:[{&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;}],&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;payable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;stateMutability&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;view&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;},{&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;constant&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:[],&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;increment&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;outputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:[],&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;payable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;stateMutability&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;nonpayable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;},{&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;inputs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:[{&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;_count&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;uint256&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;}],&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;payable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;stateMutability&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;nonpayable&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;constructor&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;}];&lt;/span&gt;

  &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;counter;&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#getcount&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).click(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(e)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;e.preventDefault();&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Calling getCount...&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;counter.getCount.call(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;result)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;getCount call executed successfully.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// The return value is a BigNumber object&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#count&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).text(result.toString());&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

    &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#increment&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).click(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(e)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;e.preventDefault();&lt;/span&gt;

      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(web3.eth.defaultAccount&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;undefined&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;No accounts found. If you&amp;#39;re using MetaMask, &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
                     &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;please unlock it first and reload the page.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Calling increment...&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;

      &lt;span style=&#34;color: #657b83&#34;&gt;counter.increment.sendTransaction(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err,&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;hash)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(err)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;error(err);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

        &lt;span style=&#34;color: #657b83&#34;&gt;waitForReceipt(hash,&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Transaction succeeded. &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
              &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Call getCount again to see the latest count.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;typeof&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(web3)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;undefined&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;error(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Unable to find web3. &amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+&lt;/span&gt;
            &lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Please run MetaMask (or something else that injects web3).&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Found injected web3.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;web3&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;Web3(web3.currentProvider);&lt;/span&gt;
      &lt;span style=&#34;color: #859900&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(web3.version.network&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;error(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Wrong network detected. Please switch to the Ropsten test network.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;log(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;quot;Connected to the Ropsten test network.&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;web3.eth.contract(abi).at(address);&lt;/span&gt;
        &lt;span style=&#34;color: #657b83&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;&amp;#39;#getcount&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;).click();&lt;/span&gt;
      &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #657b83&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum decentralized apps (DApps) connect smart contract back ends with JavaScript front ends.&lt;/li&gt;
&lt;li&gt;JavaScript interfaces with Ethereum via the web3.js library.&lt;/li&gt;
&lt;li&gt;MetaMask is a popular browser extension that provides an implementation of the web3.js API.&lt;/li&gt;
&lt;li&gt;View functions can be called without creating a transaction.&lt;/li&gt;
&lt;li&gt;To call a function that mutates state, a transaction is sent to the blockchain.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34;&gt;

&lt;hr /&gt;

&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;To use the Ropsten test network, you&amp;rsquo;ll need ether in an account there to pay for gas. Ether on a test network has no real monetary value because it&amp;rsquo;s extremely easy to mine. You can fund your Ropsten account for free via &lt;a href=&#34;https://faucet.metamask.io&#34;&gt;the MetaMask faucet&lt;/a&gt;.
 &lt;a class=&#34;footnote-return&#34; href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Writing a Very Simple Smart Contract</title>
      <link>https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/</link>
      <pubDate>Fri, 08 Dec 2017 05:48:50 -0700</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/08/writing-a-very-simple-smart-contract/</guid>
      <description>&lt;p&gt;This article will demonstrate how to write a simple, but complete, smart contract in Solidity that maintains and updates persistent state.  The demonstration will begin with an even simpler contract, which is progressively enhanced in two steps.  Future articles will build on these ideas to construct more complicated and interesting smart contracts.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;a-trivial-contract&#34;&gt;A Trivial Contract&lt;/h2&gt;

&lt;p&gt;While it is legal to write a contract that does nothing, that&amp;rsquo;s not particularly interesting.  Slightly more interesting would be a contract that simply represents a single integer value (77):&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Trivial&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;77&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a quick explanation of the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pragma solidity ^0.4.17&lt;/code&gt; asserts the version of Solidity compiler that is expected.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;contract Trivial&lt;/code&gt; declares the name of this contract.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function getValue()&lt;/code&gt; declares a function named &amp;ldquo;getValue&amp;rdquo; that has no parameters.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public&lt;/code&gt; declares that this function may be invoked by an external transaction.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;view&lt;/code&gt; asserts that this function has no side effects.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;returns (uint256)&lt;/code&gt; declares that this function returns a 256-bit unsigned integer value.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;return 77&lt;/code&gt; will cause the function to return the integer value 77 to the caller.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of that is typical of modern programming languages, except for the &lt;code&gt;view&lt;/code&gt; declaration.  The &lt;code&gt;view&lt;/code&gt; declaration is surprisingly important in Solidity contracts because &lt;code&gt;view&lt;/code&gt; functions can be executed for free.&lt;/p&gt;

&lt;p&gt;The distributed system that maintains the Ethereum blockchain is made up of a network of many nodes.  To maintain the blockchain requires that each of these nodes run a virtual machine that executes any invoked contract functions.  In Ethereum, smart contract function execution requires payment (in Ether), which is called &amp;ldquo;gas&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;Each transaction is submitted with gas to cover the cost of its execution.  Every instruction the virtual machine executes consumes some gas, which means that a transaction might run out of gas prior to completing.  If that happens, then the transaction is completely aborted&amp;mdash;no persistent changes happen as a consequence of that aborted transaction.&lt;/p&gt;

&lt;p&gt;Interestingly, &lt;code&gt;view&lt;/code&gt; functions have the unique property that they do not require any gas.  For this reason, any public function without side effects should be declared as a &lt;code&gt;view&lt;/code&gt; function.&lt;/p&gt;

&lt;h2 id=&#34;a-contract-with-persistent-state&#34;&gt;A Contract With Persistent State&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Trivial&lt;/code&gt; contract presented some basic Solidity functionality.  This next example extends that example by making the return value something that is part of the contract&amp;rsquo;s persistent storage.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;State&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// persistent contract storage&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;State&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getValue&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;state&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above introduces the following new techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uint256 state;&lt;/code&gt; declares a contract-level variable named &amp;ldquo;state&amp;rdquo; of type &lt;code&gt;uint256&lt;/code&gt;.  All contract-level variables are persistent&amp;mdash;with their associated values maintained between function/transaction executions.  (Changes to these variables only persist if the function terminates successfully.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function State(uint256 _state) public&lt;/code&gt; declares the initialization (aka constructor) function for this contract.  We know it is the initialization code because it has the same name (&lt;code&gt;State&lt;/code&gt;) as the contract itself.  This code is executed exactly once, when the contract is initially deployed.  This constructor takes a single parameter, which is supplied by the transaction that is deploying the contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deploying this &lt;code&gt;State&lt;/code&gt; contract using the argument 99 for the initializor, would execute &lt;code&gt;function State&lt;/code&gt; resulting in the &lt;code&gt;state&lt;/code&gt; variable persistently holding the value 99.  All subsequent invocations of &lt;code&gt;getValue()&lt;/code&gt; would return 99.&lt;/p&gt;

&lt;p&gt;The transaction deploying the contract would require some gas payment, but calls to &lt;code&gt;getValue()&lt;/code&gt; would not (because it is a &lt;code&gt;view&lt;/code&gt; function).&lt;/p&gt;

&lt;h2 id=&#34;a-contract-with-changing-state&#34;&gt;A Contract With Changing State&lt;/h2&gt;

&lt;p&gt;Of course, persistent state that never changes value is not particularly useful.  To demonstrate how to change state, we will add a single function that will increment the stored value to create a (persistent) counter.&lt;/p&gt;

&lt;div class=&#34;highlight pv2 ph2 cf f5 bg-lightest-blue&#34;&gt;
    &lt;span class=&#34;tc dib b pa2&#34;&gt;counter.sol&lt;/span&gt;
    &lt;a href=&#34;#&#34; class=&#39;icon-up pa2 no-underline black hover-bg-light-blue br-100 fr expand&#39; title=&#34;expand&#34;&gt;&lt;/a&gt;
    &lt;a href=&#34;data:text/plain;base64,cHJhZ21hIHNvbGlkaXR5IF4wLjQuMTc7Cgpjb250cmFjdCBDb3VudGVyIHsKICAgIHVpbnQyNTYgY291bnQ7ICAvLyBwZXJzaXN0ZW50IGNvbnRyYWN0IHN0b3JhZ2UKCiAgICBmdW5jdGlvbiBDb3VudGVyKHVpbnQyNTYgX2NvdW50KSBwdWJsaWMgewogICAgICAgIGNvdW50ID0gX2NvdW50OwogICAgfQoKICAgIGZ1bmN0aW9uIGluY3JlbWVudCgpIHB1YmxpYyB7CiAgICAgICAgY291bnQgKz0gMTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDb3VudCgpIHB1YmxpYyB2aWV3IHJldHVybnMgKHVpbnQyNTYpIHsKICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9Cn0K&#34; download=&#39;counter.sol&#39; class=&#34;icon-download pa2 no-underline black hover-bg-light-blue br-100 fr&#34; title=&#34;download&#34;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div style=&#34;margin-top: -20px&#34; class=&#39; expandable&#39;&gt;
	&lt;div class=&#34;highlight&#34; style=&#34;background: #fdf6e3&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #2aa198&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #859900&#34;&gt;contract&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;  &lt;span style=&#34;color: #93a1a1; font-style: italic&#34;&gt;// persistent contract storage&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;Counter&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;_count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;increment&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color: #2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #859900&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;getCount&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color: #859900&#34;&gt;returns&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #859900&#34;&gt;uint256&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #657b83&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #859900&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #586e75&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color: #657b83&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #657b83&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Aside from changing some names from the previous contract, this example simply adds an &lt;code&gt;increment()&lt;/code&gt; function.  There are two notable things about this new function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The function&amp;rsquo;s visibility is &lt;code&gt;public&lt;/code&gt;, which makes it invocable by anybody.&lt;/li&gt;
&lt;li&gt;The function is &lt;em&gt;not&lt;/em&gt; a &lt;code&gt;view&lt;/code&gt; function because it has the (persistent) side effect of changing the value of the contract&amp;rsquo;s &lt;code&gt;count&lt;/code&gt; variable.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Because &lt;code&gt;increment()&lt;/code&gt; is not a &lt;code&gt;view&lt;/code&gt; function, invoking transactions must come with gas to pay for execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum smart contracts represent persistent code and data on the Ethereum blockchain.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Once deployed, a contract exists forever, and any public function can be invoked by anybody.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Through the use of persistent state, contracts can maintain values between function executions.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Some, but not all, functions cost gas (ether) to be executed.&lt;/li&gt;
&lt;li&gt;If a function fails to terminate normally, it will have no persistent side effect (ie, persistent storage is unchanged from the values held when the function started execution).&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>What Is a Smart Contract?</title>
      <link>https://programtheblockchain.com/posts/2017/12/06/what-is-a-smart-contract/</link>
      <pubDate>Wed, 06 Dec 2017 08:29:53 -0500</pubDate>
      
      <guid>https://programtheblockchain.com/posts/2017/12/06/what-is-a-smart-contract/</guid>
      <description>&lt;p&gt;An Ethereum &amp;ldquo;smart contract&amp;rdquo; is a computer program that has been deployed to the Ethereum blockchain, where it will exist forever.  Deployed smart contracts represent many different capabilities:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A deployed contract can maintain an ether balance&amp;mdash;it can hold ether independently of whoever wrote the contract and of whoever deployed the contract.&lt;/li&gt;
&lt;li&gt;A deployed contract has persistent storage that maintains state between code invocations.&lt;/li&gt;
&lt;li&gt;A deployed contract executes code to perform &amp;ldquo;transactions&amp;rdquo; that are sent to it via one of the contract&amp;rsquo;s public functions.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;solidity-and-the-ethereum-virtual-machine&#34;&gt;Solidity and the Ethereum Virtual Machine&lt;/h2&gt;

&lt;p&gt;The most popular language for writing smart contracts is
&lt;a href=&#34;https://github.com/ethereum/solidity&#34;&gt;Solidity&lt;/a&gt;,
which we will use for examples on this blog.  Solidity is a JavaScript-like language with some special functionality tailored to writing contracts.  Solidity programs are compiled into bytecode for the
&lt;a href=&#34;https://github.com/ethereum/wiki/wiki/Ethereum-Development-Tutorial&#34;&gt;Ethereum Virtual Machine (EVM)&lt;/a&gt;, which is implemented by the nodes of an Ethereum network.&lt;/p&gt;

&lt;p&gt;Like everything on the blockchain, deployed contracts are public.  Anybody can inspect the bytecode of a contract before interacting with it.  This ability to inspect a contract before interacting with it enables people to verify that the contract does what its author says it does.&lt;/p&gt;

&lt;p&gt;The lifecycle of a contract is pretty simple:  somebody writes and deploys the contract to the blockchain, and then anybody can send transactions to the contract.  This is not as insecure as it might sound because every attempted transaction has a &amp;ldquo;sender&amp;rdquo;, and a contract can base its actions on who that sender is, thus enabling per-sender authorizations and security.&lt;/p&gt;

&lt;p&gt;Every deployed contract has an address, which is a unique 160-bit integer that will subsequently be used for all references to that contract.&lt;/p&gt;

&lt;h2 id=&#34;accounts-and-transactions&#34;&gt;Accounts and Transactions&lt;/h2&gt;

&lt;p&gt;Ethereum has two kinds of &amp;ldquo;accounts&amp;rdquo;, which maintain ether balances:  contracts and &amp;ldquo;externally owned accounts&amp;rdquo; (EOAs).  It&amp;rsquo;s simplest to think of EOAs as accounts that represent a personal balance for a person.  EOAs do not have associated code&amp;mdash;just an ether balance as well as a public/private key pair.  Contracts have associated code and an ether balance, but they do not have a key pair.  After deployment, all a contract can do is respond to transactions sent by other accounts (either contracts or EOAs).&lt;/p&gt;

&lt;p&gt;When one account sends a transaction to a smart contract, the appropriate code is executed as part of the process for committing changes to the blockchain.  The committed changes will be the (intended) side effects of running that contract.  These side effects are typically changes to the internal state of the contract and transfers of ether between that contract and another account.  Transactions are executed on all nodes in the network when a block is committed to the blockchain, which is part of the reason we can trust the results of their execution will be recorded.&lt;/p&gt;

&lt;p&gt;The execution of code associated with smart contracts along with the permanent maintenance of the corresponding state changes represent a cost to the Ethereum system.  Therefore, the execution of smart contracts requires paying a
&lt;a href=&#34;http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html&#34;&gt;transaction fee&lt;/a&gt;.  The measurement unit for these computations is called &amp;ldquo;gas&amp;rdquo;.  Every transaction includes the amount the sender is willing to pay for that gas (in ether), and a limit on how much gas can be spent.  Once the transaction completes, the sender pays the transaction fee of the used gas multiplied by the specified gas price.  Every single execution step of a contract&amp;rsquo;s code burns a little gas.  If there&amp;rsquo;s inadequate gas to complete execution, then the transaction is aborted, no changes happen, but the sender still pays for the gas that was consumed.&lt;/p&gt;

&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Smart contracts are fully-programmable agents that can exploit the guarantees of a trustworthy blockchain and cryptocurrency.  Many of the next posts to this blog will be an introduction to smart contracts through progressively more complex and involved examples that will exploit smart contract&amp;rsquo;s unique capabilities.&lt;/p&gt;

&lt;h2 id=&#34;other-resources&#34;&gt;Other resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.gjermundbjaanes.com/understanding-ethereum-smart-contracts/&#34;&gt;Understanding Ethereum Smart Contracts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://ethdocs.org/en/latest/contracts-and-transactions/contracts.html&#34;&gt;ethdocs.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
  </channel>
</rss>
