<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>jamco.eth</title>
        <link>https://paragraph.com/@jamesmccomish</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 22 Apr 2026 11:54:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>jamco.eth</title>
            <url>https://storage.googleapis.com/papyrus_images/c033f115150b5c68158e0f7a6d3761bb.png</url>
            <link>https://paragraph.com/@jamesmccomish</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Testing evmbench]]></title>
            <link>https://paragraph.com/@jamesmccomish/testing-evmbench</link>
            <guid>iNlC14UKSsLKQ8AU43mD</guid>
            <pubDate>Sun, 22 Feb 2026 13:53:28 GMT</pubDate>
            <description><![CDATA[I ran EVMBench against 2 sets of contracts I built over the last year. One simple repo, and another much more complicated one.]]></description>
            <content:encoded><![CDATA[<p>I ran <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://paradigm.xyz/evmbench">EVMBench</a> against 2 sets of contracts I built over the last year. One simple repo, and another much more complicated one.</p><h1 id="h-setup" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Setup</h1><ul><li><p>The instructions in their <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/paradigmxyz/evmbench">README</a> were clear and with a couple of minutes I had the local version running</p></li><li><p>I needed to add some credits to run - nice work OpenAI</p></li><li><p>The first repo I tried was over the size limit, but that was my bad as I zipped with a lot of artifacts</p></li><li><p>Adding a folder non zipped gives you a good overview of the code with issues highlighted</p></li></ul><h1 id="h-runs" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Runs</h1><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/480decb5c52ba82b211acc364f95fdd6f2be3f4fec5cc440a77736ca9fa37727.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAKCAIAAABaL8vzAAAACXBIWXMAABYlAAAWJQFJUiTwAAACeUlEQVR4nG2TsWsUQRTGr0nnH3CFaJN/IJyg5RkJ2W4LZcqJIDkMxEWRrBYyeiash6frXQx7kJBsEovhqhctzi1CYCthISJrEzNJ5VaSuStyjE2OJ9mXnEH8NfOY2Znvm+/tFNI05ZwHQWCM0TnGGABgjGVZZnJoXmsthIiiyBjjeV4cx4gohLBtWykVxzHnPAxDRLx4VMHzvGKxWCqVOOdujhCCMVYsFllOpVKhedd1S6WSZVlCiNHRUcuy5hcWro2NXRoZcRyHc371yuXJyYnp6em7U9zJAYCClLJwjlKKLCulbNsul8uWZQEAmSLjvu8jIl0aERvzL2+P3zTG9Lp64cXccqtRr1Vn708lyRfaVdBa+74vpQyCgG6NiGma2rbtui7JeJ5HXwshSIAxRsWb6vM7E7cQcffr7uzcw+P+8dANUaCBzqU1EvB9HwB83/c8DwAo0yiK4jg2xgRBAADG/N7+3Fl53zTG7P3Yg09bWfZT6yOt9XG/f9YDiihN0yzLlFJaa0RUSpVzGGNRFA1NOY5DxiuVysb6OiK+rVYnb1zvdbtHR7+ePXlQr1VXWs25RzPLrcbJYHAqoJRyXRcA4jj2fT9NU7oBY8xxHOqwlJIEgiAgAcdxKLfVpcXHlXuIeHiwX69V23JzpdWs16qHB/tnEeH/SJKEMRYEAefctm061BgT5lAzwjA8GQzkevh0duZkMPieflt896otN5dbjaXm67+/aZIkQggpJQCEYfhPQaEDgMyhguajKAKATqezvbOztrYqZTuKoq2tj1K2Nzc+SNlOkgQRTwUupjxk+LiGXi4+n2HR63Z73e75pr4xp72lJQrjD/OFpHwUezRsAAAAAElFTkSuQmCC" nextheight="948" nextwidth="3094" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The <code>detect.md</code> prompt says to only flag issues related to loss of funds. Because of this it is instructed to <strong>only report issues as high</strong>, and seems a bit trigger happy (especially with the 5.2 model). Though the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/paradigmxyz/evmbench/blob/main/backend/resultsvc/routers/v1.py">results handler</a> in the code itself seems ready to handle cases from critical to info.</p><h2 id="h-megaparlay" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Megaparlay</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/jamesmccomish/megaparlay">Megaparlay</a> was a simple set of contracts for making parlays on the Conditional Token Framework. It had ~700 LOC of interest in the main contracts, along with testing and deployment scripts.</p><h4 id="h-v-001-high-both-stale-userbalances-accounting-enables-double-withdrawal-and-drains-future-jackpot-funds" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">V-001 [High] (Both) Stale userBalances accounting enables double-withdrawal and drains future jackpot funds</h4><p><code>userBalances</code><em>&nbsp;is only incremented on deposit and (sometimes) decremented on migration refunds, but is never settled on loss or win, enabling past participants to withdraw against future deposits after&nbsp;</em><code>withdrawalsEnabled</code><em>&nbsp;is triggered.</em></p><h4 id="h-my-feedback" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">My Feedback</h4><p><code>withdrawlsEnabled</code> is a flag that lets users claim their balances in case the owner stops uploading parlays for over a month. That would result in the game becoming stale and un-winnable.</p><p>Megaparlay V1 was planned as a single use jackpot game, that was eluded to in the comments on the contract and README. It's true that if they wanted to players could have kept making parlays after the first jackpot was won.</p><p>After the withdrawal timeout was triggered any players who lost in the original game could have claimed their refund in this non existent second game before the new players. <strong>This was known but could have been easily fixed by closing the game more officially with another flag, good to highlight tho.</strong></p><h4 id="h-v-002-high-52-only-anyone-can-front-run-and-choose-which-winning-parlay-receives-the-jackpot" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">V-002 [High] (5.2 only) Anyone can front-run and choose which winning parlay receives the jackpot</h4><p><code>claimWin()</code><em>&nbsp;does not require&nbsp;</em><code>msg.sender</code><em>&nbsp;to be the parlay owner, allowing third parties to decide the jackpot recipient among multiple winning parlays by calling&nbsp;</em><code>claimWin()</code><em>&nbsp;first for their chosen parlayId.</em></p><h4 id="h-my-feedback" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">My Feedback</h4><p>This was covered in the comments and was intentional. V1 was a simple game where the first winner to claim took the jackpot. <strong>This is not high, but possibly useful to flag as info.</strong></p><h3 id="h-megaparlay-review" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Megaparlay Review</h3><ul><li><p>The issue caught by both was not going to be a problem given the wider context of the project, but it certainly was something that could have been easily fixed on the contract and was correctly flagged as high.</p></li><li><p>5.2 also flagged something else that was not an issue as it was commented and part of the design of the simple V1 contract, 5.1-max correctly ignored this.</p></li><li><p>5.2 gave a deeper walk through of the issue and a better POC.</p></li></ul><h2 id="h-onit" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Onit</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/onit-labs/pm-contracts">Onit</a> was a complex set of contracts that implemented a new type of prediction market. The code included low level bit manipulation, math functions (with prb/math), multiple token standards, and factory contracts.</p><h4 id="h-v-001-high-both-unchecked-erc20-transferfrom-allows-minting-shares-without-payment" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">V-001 [High] (Both) Unchecked ERC20 transferFrom allows minting shares without payment</h4><p><em>The order router does not verify&nbsp;</em><code>transferFrom</code><em>&nbsp;success for ERC20 markets, so a trade can mint outcome shares even when no tokens were transferred to the market, enabling subsequent draining of the market’s real token reserves.</em></p><h3 id="h-my-feedback" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">My Feedback</h3><p><strong>This would definitely be high</strong>. <strong>It exists in a file that was never used</strong> in production and should have been deleted, good flag.</p><h4 id="h-v-002-high-52-only-payable-routerfactory-functions-can-permanently-lock-eth-sent-with-erc20-flows" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">V-002 [High] (5.2 only) Payable router/factory functions can permanently lock ETH sent with ERC20 flows</h4><p><em>Several functions are&nbsp;</em><code>payable</code><em>&nbsp;but do not account for&nbsp;</em><code>msg.value</code><em>&nbsp;when the market uses an ERC20, and there is no recovery mechanism, causing accidental or UI-induced ETH to become irretrievable.</em></p><h3 id="h-my-feedback" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">My Feedback</h3><p><strong>Maybe this could be flagged as info, but there is no attack that can come from this</strong>. If the user or client accidentally sends ETH to a payable function when creating a market or betting on an ERC20 market that ETH would not be recoverable. But this is not something essential to deal with on the contract, and adding 'withdraw' functions to deal with this is another attack vector.</p><h4 id="h-v-003-high-52-only-voided-market-refunds-can-be-permanently-blocked-by-transferable-erc1155-nfts" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">V-003 [High] (5.2 only) Voided-market refunds can be permanently blocked by transferable ERC1155 NFTs</h4><p><em>Refunds in voided markets require burning an ERC1155 NFT from the trader’s address, but the NFT is transferable and not kept in sync with&nbsp;</em><code>tradersStake</code><em>, which can make refunds impossible and lock funds.</em></p><h3 id="h-my-feedback" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">My Feedback</h3><p>The only sell mechanism we had in this version of Onit was that a trader could sell their shares back to the market for their current value. We didn't have direct sales of positions to others, but the underlying ERC1155 transfer function was still usable. There was no functionality built around this on the protocol, and no real reason why someone would buy this NFT as it was more of an artifact related to the market to hold in your wallet. <strong>But without context on that, it's correct to flag this as high</strong> this could have been made non transferrable to make this clearer. </p><h4 id="h-v-004-high-52-only-permit-based-allowance-updates-are-front-runnable-enabling-allowance-hijacking-and-theft-of-market-admin-funds" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">V-004 [High] (5.2 only) Permit-based allowance updates are front-runnable, enabling allowance hijacking and theft of market admin funds</h4><p><em>When a permit signature is provided,&nbsp;</em><code>setAllowances</code><em>&nbsp;allows any caller to set (or rewrite) the router’s internal allowances for the market admin without authenticating who chose the spender list, making the transaction front-runnable and enabling an attacker to redirect allowances to themselves and spend the market admin’s funds.</em></p><h3 id="h-my-feedback" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">My Feedback</h3><p><strong>This is definitely high and was missed</strong>. If a market admin sets allowances, we check their signature to make the ERC20 permit to allow the order router to allow a spender to use some tokens. But this signature is only over the amount, nonce, deadline, owner and the order router - it does not account for the array of allowed spenders, meaning as long as the overall amount permitted matches the signed amount, any allow list would pass. If this tx was picked up in the mempool an attacker could replace one of the allowed spenders with their own address and make a bet on the market.</p><h1 id="h-overall-feedback" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Overall Feedback</h1><ul><li><p>The tool is useful and it's cool to be able to compare the models findings / style easily in the UI</p></li><li><p>The UI is nice and very easy to use.</p></li><li><p>Need more detail on the recent runs, like what model was used, did it pass etc.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4683219c3b02fef4e30666382d06e0dd02bacf29abb5d73c7d1489a84b09e9a3.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAbCAIAAACSpRrNAAAACXBIWXMAABYlAAAWJQFJUiTwAAADxElEQVR4nKWWzU/qShTA+Wg7k9JCpRSn7UxLSiuUgBI0gCCaaCLhwn0S4sJ/2IUbE6NGYlyQ6EKieSwNGpKXdrRXo94I77c4OTOdmdOer2lIFEVBECCE8TdkWaaTPM/H/jchjPHh4WG73R4MBrZt7+7u7u/v27Z9dHSUz+c5jovFYvyieAZEUcxkMpqmIYTS6XQqlVIURZZljHE6nU58RJKkv+jBDFWWlpYEQQglEol0Oq3rOiFE0zTDMKhUVdUwDIwxlcQnGJqmqet6IIN5wzCCZaqqxuNxzwA9nRASmKESY0yl/sb7yS9lsBJj/GoAQsgwDMdxAAAaWyrj8Xigiz7vh98tE3yC4WuQm81mpVIplUo0LAuH9DOeAVVVGz6VSuVzkgmLQvd6BgRBkCQpmUwqioJ8VFXVNE31SS+KrusIIVEUvSA7jlOr1VqtVj6fr9Vq9Xrddd1CoeC6LrU3LwihYrFomqYXZFrGEEIAAMdxVGdZFryDewMAQB8Fw78AIfRclEwm2+12t9v99Uan0wmGnU6n1+sdHBz0+/3fPoPB4B+ffr/f6/V+fUO3293b20skEqFms/n8/Pzy8jKdTp8/Mp1OZ7PZeDweDofn5+d3d3f39/cnJye3t7fX19cXFxcPDw+z2ezzRnrg09OTbduhWq32+Pj47zdMJpPRaHR5eXl6ejoajW5ubo6Pj4fD4dXV1dnZ2Wg0mkwmX26fTCbj8TibzXpB3tjYqNfrNLxUCfR6vd5oNLa2tra3txuNRrPZ3NnZ2fJptVqNRqP+FdVqdXNzs1KpeFkkiiLHceFwmGVZhmEikUg0Go1EIuGPhEKhQAkIfwOEMBqNMgzjBVlRlPX19Xw+Xy6XEUIY47W1tWw2G3SIeZEkKZfLlUol13W9L4jFYhDCIOeostjdAv1cD1L5tVXwPC/LsmEYpmkihGjvjcfj815nPM8rioIxRgjR02RZ5nk+BADAGFer1XK5nMvlqtVqsVhUFIWWyc/heR4hZPsUi8VSqYQQghB6lQwAiEQiDMOwLEuDM+/plOCcqA91tXcfKIriOM7KygohJJfLWZYlSdICLlpeXrZtm95dhJBUKuW5CEKoaVq5XC4UCrZtU0fRZ7TfzmXAcRzDJ3jLPy6izqGSYZj3DeuHAACC7X9cBAAghKyurmYyGdeHRimTydAfC/CzrOV5XlVV27Ydx7F8Xl0EALAsq1AoEEJc1836uK5rmiYh5OfpRLPIsqxsNqvrumEYr2lKC4SWRtDrWZalFTeXi2jB0o0cx9FC+w/1f2jlBeU7cwAAAABJRU5ErkJggg==" nextheight="928" nextwidth="1120" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure></li><li><p>Only <em>detect</em> was enabled, there are plans to get <em>patch</em> and <em>exploit </em>working and I'd be keen to try them.</p></li><li><p>It is something I will likely use in my next project.</p></li></ul><br>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <category>evm</category>
            <category>paradigm</category>
            <category>openai</category>
            <category>llm</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/62b667abe5ce6f21193fa40f0bb7a01532f5670cd714a5fd6a62007d13905e44.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Foundry `evm_version` Gud]]></title>
            <link>https://paragraph.com/@jamesmccomish/foundry-evm_version-gud</link>
            <guid>p27lzdWOBg4fmZ2HWYzh</guid>
            <pubDate>Thu, 16 Oct 2025 17:47:00 GMT</pubDate>
            <description><![CDATA[Every so often I'm reminded how great Foundry is to work with. I'm building something on top of Polymarket and I need to go direct to the Conditional Tokens they use for events, so I need to deploy on Polygon. When trying to deploy to testnet I was reminded that Polygon (PoS where Polymarket is) doesn't support anything after the Paris hardfork, and since I used Solidity v0.8.30 that was a problem.I was afraid I'd have to update the compiler version across my contracts, and when I tried to, i...]]></description>
            <content:encoded><![CDATA[<p>Every so often I'm reminded how great Foundry is to work with.</p><p>I'm building something on top of Polymarket and I need to go direct to the Conditional Tokens they use for events, so I need to deploy on Polygon.</p><p>When trying to deploy to testnet I was reminded that Polygon (PoS where Polymarket is) doesn't support anything after the Paris hardfork, and since I used Solidity <code>v0.8.30</code> that was a problem.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/48f183f0e2619b2131839672757092b6a761abc827a52aa1a75b6bab2f39e610.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAADCAIAAAB9IJo7AAAACXBIWXMAAAsTAAALEwEAmpwYAAABLklEQVR4nAEjAdz+AIGNlebw99Xe5bnFy8LN1O/7/5Geo5ajqZ2nscXR2W56g2p2f0dSWmx5fklWXWp2f1ZlalhlbGBtc4SRl0xWXoCNlBwrMQAADAAFEQIUGgALFQALFQALFQAFEQAFEQcXHQCAjZTt+P7Y4+mtu7/R2+LJ1d2tu8Cfq7Lo8fjZ4+paZmxJVVxTYGZdaXBJVl1lcXo8SlE7R1BseYBBTVNueYBYYmlYYmpXZWtmcnlGUllPXWNTYGZPXWNpdn5daXEYJSoAbHmAmKOomKOog46VztffvsnQo6+2eIWMlqKomKOqsLzAo6+2r7zCn6qwvcjOytbdsLzAucLLxtHXvcjOzdnds73Fzdnf0d3jXWlwMDxEPkpTPkpTPkpTWGJpQU5UKDc8M+SRzhQWiCEAAAAASUVORK5CYII=" nextheight="68" nextwidth="687" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>I was afraid I'd have to update the compiler version across my contracts, and when I tried to, it caused a lot of build errors in my tests. Then I thought that since both <code>solc</code> and <code>evm_version</code> are included in the <code>foundry.toml</code> file, it'd make sense if you could set an older <code>evm_version</code> and the compiled code would avoid opcodes that didn't exist on that version.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2c4b0231821274a830103ef2fd1d43e116e756a136329ea32a8acdecfc1fd9f3.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAHCAIAAADmsdgtAAAACXBIWXMAABYlAAAWJQFJUiTwAAABzklEQVR4nGOYMX16clJSTHTM1KlT4+Ljk5NTkpOSIiOjWlpar1+/fo5iwJCZVWjv4Gbv4FZUXG7r4ObjF2JobFNdXbNy5arr1AAMMkr6+haO4bGpxhaOsqpG5rYeDm7BJ46fOHLk8K5dOzdt2rwbDDZt2rQbA2wiAjAcP3p0YvfEHdt2HD1yaOem9ds2rps7fcr69evXrlu/eOmyHTt3Llu+fOXKVTt27pw/f8HKlatWrly1fv36lStXzZ+/4Ny5c5BghJPIjAcPHly/fo1hyuTpDAwMTjYe9pYObAwMxho6Zppa8VHRLg6O6iqqRfmF7h5eDo6uCYmpTk7utvZOYeGRGZlZ8QlJ7h5eU6ZMXb9h4+7du3fsBPl1wYJFYB/v3bRp09x587u6e1auXMWwbMlyKX4FM11reTFVZgb+sqLK5cuXp8dEWevq2ejpz5k+fe68+bW1DeER0U3NbS0tbY1NzZVVNdOmTS8sLA4Lj6ysqpkyZWpFZdX06TMLC4srKqumTZteU1NXWFjs4OBS39jIcOr0qRcvXzx48ODFyxevXoEY169fv3f//ouXL1+8fHnv/v1HhMD169cfPXp0+9YtZO6jR49ev3796NEjAKOGrg7DL0bYAAAAAElFTkSuQmCC" nextheight="246" nextwidth="1172" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Turns out that works and you can change the <code>evm_version</code> and it will compile to exclude any opcodes supported in that Solidity version which that shouldn't be used on that EVM version. </p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5d723a0855da61ee2db37a0493fdc8f86ac61ccf540a526cfcf2359bb40848f5.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAKCAIAAABaL8vzAAAACXBIWXMAAAsTAAALEwEAmpwYAAADcUlEQVR4nD2Pb2gbZRzHnworwxcDfaOCrDTJ5ZoYpa70hQoi4iuHggym6LQlMy5lKgymE8WBL1Qs6v7VYdq0F5uu+Xu75Jpcl9yfXK+XXHqXrLkmvWRJljS5damb1Vq6vj1JUwsPXz7P9/d5fvAAPQAXj7956qh+2GAaNpjef1b3Ua+xcw54yABbjeaOYDWarEZzp+80B9BxrMb9PV++9roeAPD240/HOfmX7xExq5TVppRK3gqhmbQQ+APhGUapq5limZMLnFzIV+uFWpMWc7xcKKvrmWJpSSmSgkQK0mq9WWttMNJyodYkBSlfre/u7mqa9u4zPeANcDiKJ6d+dUbRqBfxxUO3rn53mQ4TPEVy88R8MEDhODYz451Cwh4PEyexIBr0B2IEwbMsHSOxm1gUn+MXOJamYwQh8HwUn+NYdpFhNE073v0keKv7qTCW/O0H94wjOvr1JOqmvzl7lSSEtfsbrTWVxvB5r99/fYJGsWa50tr4q1CqZXOKkMm3uVhlk1lxeXXzn20uLUu5olJpiFmlUKoxbHr/BwCAl2GgA0APQN8RAB0CfU+0U7/XQIcB1N0GwyHQC9qaoWvv2rX/xNC1z9BjbaH3f0EPwMDR9nJgGe5dSXGT45dQ3xSOTt9ArrmdV/yz4zf9k4jjZ697LOCdQH0TvhuOEOrCMTfqc4ZQFxZEAl4n6nPuTZ2eGUfA68Sx6UjI3Rn5vePlFXFwxAw+vPJeMrR0+sR5EueX8/mqooRcSMiFpCnqx88+v9dU01k5wQkxmp/1YdW7DVGSsXAMC8fyqyUxu4KiUTqRxCNkjFxobTzAI/GUkKUTKV8Q1zTtjMMKTv70jkTmro1OCIui6/fZeJRxXZ+ddnhyck5KC8kEzVMxjqJSCYZlWZJh4yQ1FyFysiwsLcVJaoHjiqUSx/Est5iT5U4yDCtmJU3TTo6eAENjH9wR7lz6dlIkc+7LGOFhg+PznrHIutra2toupdO343Qlc/uhem9n51Hr/p/Vylq9pm5tbTeb69XKWq2m7uw86pQPH/x9t9LY3PxXUaqNhqpp2lnEBsBz4NWvXhm4cAyyQS9dHHzxXP/AF8cGL/TDdhNkg4x20/Pn+o12k+5jGLJBsB22jJhh+wH3wXZTz6key4jZ9EkfZIMsn1raOWLWDemMp2HwAvgP+N8Xww7ySaEAAAAASUVORK5CYII=" nextheight="304" nextwidth="978" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>There is even a convenient tool to check. Running <code>cast disassemble &lt;bytecode&gt;</code> will show a human readable version of the code that you can check for banned opcodes like <code>PUSH0</code>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/07bd7cc490e5a7ff5f1346b53f8be0098a0b617d59f566e8f28ee920e4e96288.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAATCAIAAAB+9pigAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE4UlEQVR4nIWUa0yaVxjHT1bbSmS6VgOhOFfr3QQ3L42aooWV5h34rigrsdY20zm7smicM1ov81aUiB1WQ961yhhtQQQVHAYVhjJfBWE4G2pgc0ZXq73YNpvbvvVLs7zSKKLdkufjec7vPM//f/4gJjH17xcvlx6ua8bGheJuOsyxO91G1JZb+BmvsqaigZ+UeQrggnHEUDwpDOAOp56E7i0uD+pNiEzR1omkpmZYzNODvf2HieQDBLI/0bdAVEKKa/mB3emWKgdKrtQnZZ4yWRyaEVNMYiod5sSmpAG/IDwpzJ9IxgD738qA4Ecb/0xYHVKVprFZUMyEp40T90yTaUcjQSBxb8CvK49m7rokvf0FvDIGm2tEbRVfXaWxsrvv9DG5530AJ05nLT9+bkCtMs33N7u/vcQ886PBtGT7mRoZD3DBnpN7TDA96+y+01de15STX2hArVXNrYfCIgAA3j0eAPU0fP/JcyNqkyoHBJ0Il5tvMU+7na6Piy77E9/eewL38uqUw3lLra1tEdJYbANqvf/kj2uIJC4lfT+BtHXUG2BArVLlQKtInJzJmPhprn90HLmtPH7y9O4hMMAvy2uT9jnlkP6GrDeNDo1OWgs+/yKviHcsIRkEEnwAGRAGGDVbZCoNXyRmcs8rh/RRCSm7374DMOVwyjW6GkF7Tn7hLbU2/1MewAUDXEgAKdR3AgjT4Ad0RtLbX3KlnvlRns5oVg+PESJi9oWQ/gug0Orbum5AnFyTxW6y2MmxFJ8GvBfAiNp65Oo28U06nONafqDQDgeRw18L8Ggg1+gEnQiNle387Xe5Rre7Ae8FwFyk0tQI2iFO7qxrobKpdbd/drho0j7XpxsVdCIQ55xpxkFjZe9uwO+0qUKrbxR2UCHWiHkqKjEVAPz/aKDWG6XKgbiUdCNq41z8BACwJyADglee/mmaccgHdV2S20lU+qxroVHYEU5JPhQWEUAKDSBhf37rfRhgcW3d7nQrtMOtIjEdzpmedd6Q9ZZWNYSERXpvaQuw+mxjwuq4pdZWNPAzmWdMFkeDUMSrrMGuA3jgF7RZeI8DMcDSw6ezrgW13ojIFJnMD4cM46XV9VGJx/GkMBwxdF8ICQQS9oWQvKNi0jEnVQ7wRWIaK9uI2srrmsIpyVQoi8E+mwHB6e9/AHFywymJIJCAARZWHtudbvXwmEyl2XSRA5Ep8op4Vc0Cvkjc1H5d0Il0SW5TIRYAIJN5ZvXZhtmGAdrENxlsrmVuni8Sw9wLxWVVl7+s5lVWl9U21bYIk6h0zOsekaccd+Xa4dqWNhqL3acbLa9rJkREk6LiSVFxR6LjQ2MpR6LjDx2NBH5BrzSw2KXKgavtnXQ4R29Ce+Qq7FeCA9hyPFsCB7dX5HGRQqv/+hsJg31WZzRb5ua5BcUAHPQLOYKNuVk+WSRTaYTibgabq9YbPaOAQEIQOdyj8A6R5xdXphx3ZSpNRQOfDudcQ3rePUELIr/zOpsurq2PmKd65KqqZgEVykJkCizVwRt7foVXIntcVNsiZLC5g3pTXhFvK6V9ADRW9l8vXtqdbuWQ3pNFI2YLxDkHAgk44naubAOOJSQbUKt6eKyj+7vS6noG++w1RBIaS/GOuW3Am4Sjce+V1zVduFTCzi+Acy9S0mlw7sU9Q8ID+BdK73Bjuy3RkQAAAABJRU5ErkJggg==" nextheight="1491" nextwidth="2500" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>It's worth noting that this might not always work. My contracts were pretty simple and didn't explicitly use any features that were not present in <code>v0.8.19</code> so recompiling and checking all my tests was enough.</p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <category>foundry</category>
            <category>smart-contract</category>
            <category>solidity</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/c9b0c90ba87cf418f5da569748cb13e1bfec5bf241a696064182074d895f885e.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[A Year In Berlin]]></title>
            <link>https://paragraph.com/@jamesmccomish/a-year-in-berlin</link>
            <guid>rUV54tnk6m8RImkEd8mW</guid>
            <pubDate>Mon, 08 Sep 2025 15:04:12 GMT</pubDate>
            <description><![CDATA[It's been 1 year since I moved to Berlin. I had a good impression after my first month here, and I'd say after a year it lived up to that.]]></description>
            <content:encoded><![CDATA[<p>It's been 1 year since I moved to Berlin. I had a good impression after <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://paragraph.com/@jamesmccomish/first-month-in-berlin">my first month here</a>, and I'd say after a year it lived up to that.</p><h2 id="h-work" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Work</h2><p>From a diary entry in week 22, I wrote "I guess a lot has happened since the start of the year, but all within a very small set of things, and almost entirely in Berlin".</p><p>It usually feels like things are going quickly when you have a repetitive routine, and compared to the past couple of years in Barcelona when I travelled a lot, this year has been very same-y.</p><p>Likely because 2025 was the most intense year of building Onit. Since we pivoted in January we had to research and build our new product from scratch, and because we've been low on funds, things have been pretty urgent for most of the year.</p><p>I don't think that quote was a complaint tho, I've enjoyed being here and the work I've done. There are interesting crypto events, and working from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://w3hub.berlin/">Web3 Hub</a> has been great. It's nice to be with a group of people working in the same area, but not on the same thing. I tried another general cowork when I first arrived and didn't really like it, there were a lot of people, but I didn't care much about what they were working on.</p><h2 id="h-public-spaces" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Public Spaces</strong> </h2><p>Berlin has great parks, libraries, and abandoned buildings. Cycling around <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.tempelhoferfeld.de/">Tempelhofer Feld</a> is relaxing, and going down the main runway at sunset when the wind is blowing from behind is probably my favourite thing to do in the city.</p><p>Although not really 'public spaces', events held in abandoned/repurposed buildings are cool. They range from gigs to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.thedarkrooms.de/">light exhibitions</a>, and sometimes involve just opening a building like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://kraftwerkberlin.de/de/">Kraftwerk</a> for you to wander around. Feels like a thing that won't last forever in Berlin and I'm glad to have made the most of it.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/32d3a74d027003134d486772d3ac840e.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAOCAIAAADBvonlAAAACXBIWXMAAAQnAAAEJwHZTx2AAAAFUklEQVR4nBXNeUxTdwDA8R+IqCMgt8jloNyX0FYaKNBXkdLWFtrSA0v7nrSUo9DaV+illFPOHlBpoVKhDQxhjgoioJvZJIZtjCVblmzTPzb/2eJmpsm2mInZkreQfPL99wuysjNKSwpnJ7USAVVzmbm36Ry/2kImZOTn4aCS9HiqiGDbJ0+8LLO/Lpt4XT71Z4X7L4rn78r5N+zFt/VbmEytVzLOaPh4g5iECvAafpHqEL6de7adW6SoKQJxcZFMOtm/OIi21Kpkgmf723MWLYWUSSnH52ZGlNbJWzexat8bivMt5D6AZv+hzh1Q598xb//Lv4fJdrHOnhGjILtXBvXJKrqRcjNScQ2mXIMpegnFAJ/vukQFQUdAdlbS5Cg6Y9Ma0ZbVOWtZQQq7mnyRWZaWdITIb2atY1VejO35vXb5HeNDrHoFE/kx9p3/qlcw5AnWb3U4VFSnrs7ZxT2sXuDU1zt0Ygtab9Eh41opAODw0QjzHm97lDKhtR9lV5Ww6GQqlJcQCQJyWIXm/UThIJEhkRqs8sXnbN+rW8+xh68w63eYYg8bn/bNmzieXvhWj9RzCL7ZjbhMiL1TPKGTjqnrAQgAiYkxycmnOSyqUavgc2kEfBYuJQaXEhUTAQLDY+NLWSH5lZms1lG702azS9Xdzo29pxi29hpr/RobnrR5TVyPWeLpFnlMghmjYEovchhgh7nZPaLzusfBqbjI06cjoyKOBQcDQmFGakp8TExoyHEQFhpwLAiAYycBjgrSoKgi+u1F79b9Df/6xqTLdW//J+NTrHblhUkjWZts9w03L9rVi06T7+aQz+dcWl1affTx/c93Vzb9IDzsSEpqbHT0iWJCpm1E162T52QnR0UdjYs9HnICpKanKVSdZWxhAU1M5jW26oyO6VmRuq8ZvWZ7+D3TvgbDtW0w45KU499e/XR/5+5XT7Zf/ObZeTztGtra2VrbvANCQwAOFxEaBvLzcMPX0ZEhfUZ6QlAQCAsLjI4OJhBz93bWPtlY3rx7e2FhTtqBZlI5k04Xp1HVP2bjaQ01PCZSR6NxKQv3lqZnhizXzeOzszO++eU5h9+/vLu7AyLCA6GKs1oNMmHtW/TduPvRvEbdRKOVhYUGh4cHJONSmUKkprFd2Ia2dF61Wsd0xquDo6OshsZGpUrQ1Maup/BlxQxFhaiHL5Ax55Y8fB5PKZcqW5uuaPUqnQlIJHWjYwMLCx6v1+1wjFuswxMOy8joQIeqhVicExhyAsSmljNrxApFbYOst6fH5W6pV9Pb+9iX2wUZEBMi5dQQ4wWUdDabcqW3Y/ubLxtEfFhYS6+iGYzGEbcXqNRKhVLRqlKiWlVP77XePnOXHtUb0A61UoqIcQVFCbln3c7rUgSWtgrr2soRY1bLWG7zaC4fzRRpmWxytgCXUJeTMWDSb7s6Hzj1dyzokqXT3Yt6bf2z9iEgFPFEDSJZE9LW1tRt7uofMOn0V9qUTUqlXCDkltEpIDourSA/LA53NPEkTZEC96azNEk8XZIITX70hamSkgoAiAJgXi/+2dP8rUPxmUP9wKHxW7Vrk0a/axhAlVAl4wKNSWNzWFJE3CiHYVhcx+dw+WwWiyFXsvEsUhI++70zOByhkFSDf78qLod1iobgmnVF1ql2u56ju1hIqm4w2OZueDdHrB8Mmm9292waTeudmvVhrRnkEwsLz+GLSUQyRD5ffQGqpJZTIeg8RK4oJRKIIjkVneZWSM5x5NUwykgoSQhIPFVEz1NoSSJ5XoOqGEVw9OxYCnPq8Q/YL++wXw+wFwfYsz+wH19i/h0sI9fwP/e1HivugI37AAAAAElFTkSuQmCC" nextheight="1533" nextwidth="3466" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://kraftwerkberlin.de/de/">Kraftwerk</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Research_Institutes_for_Experimental_Medicine">Mäusebunker</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://staatsbibliothek-berlin.de/die-staatsbibliothek/die-gebaeude/potsdamer-strasse">Staatsbibliothek</a></figcaption></figure><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://staatsbibliothek-berlin.de/die-staatsbibliothek/die-gebaeude/potsdamer-strasse">Staatsbibliothek Potsdamer</a> is my favourite building in Berlin and probably in the world, it's such a strange shape, and feels very different depending on what part you're in. Some low roofs, some huge rooms, a couple of spiral staircases, a few slabs of concrete, comfortable chairs, and a cafe that sells really disgusting sausages, it all somehow works together to make a great library.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2f4a6e8804cb6d031b257f66042d83fc.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMCAIAAACMdijuAAAACXBIWXMAAAQnAAAEJwHZTx2AAAAEiklEQVR4nBXNaUxTBxwA8H9s6bAdWhUt5Rrau+/1fG3pTQvyWihC6QVii1isttUidPYCewMFuQdMJybEY5fGsDlnxswWRuZmFvdBzWZmTJbMGYyJ++CSfTJhMfl9/8HAEZuEU85jlNu6A9pagUdeUbBhkf3sm0H5NSfpIg6ftMJVC+HZvH7zZ/dXHrqQSRRwivj7gFUJnGpA9gGf8ZaQCRgbFHyiUkhUo0S1kFQn3aqVkiEd9SX6fWPZSJ2MiXJrlDqt1ySJm7mbz5O/jBjSKsqMmTooJ2xcaNz80TW7n4TxKDJ0h4S3XcKjIIwt/L0gYBKFnC1SLkHGBRmPqESL3gYo0SDdqpeQoZCLLU6lpwuJ1OneaLDLqBEJUIZDx/8yafpp3NTJARenaMpa9fpa2zUnrY0Ozk5zk0mqxiprRWVyQSmGUCXcbVIuRYZSlCi5FilWIu/oxW/Vy8hGybswXshkkuF0om88H5sYjY5m+qOhQ416qQypub9s09QQSgAcssq/rhxc8dDG9eDzOcLR4x73AYOagyF7ZEiZDKXJkV0Yd1stsr1OutMg2oZjJc1YiU1FdaipsHxp6dy5uYW5samJzOxUNh0P5M+cnB6LTw1HQr1uLcbVIDW44D2/UTDeWBwRwwmrbiYbns5HFiZTi1Pps9lT0/nwwmTi0ofDgUM4WgmKfSR5FcjLAd0BfCrA+oNfv15fW7nzzY3VmzdWVxbmC4UPJhauXB5KnPZ1WuMh72ivZbmz5pKrLKkGTQkcb6///fGDv/95+ezVxp+vNn5YX3345NEfT3+7d29tZCQprAJhBYhogNEhbCpPmGnwdOPl/cdP7z96fOfu3ZXbt87PFrKxgXzihN99oLNeUA6grCoaNZfd7KI97GcuO2m+FvWzFy9ebm4+ePH6yb9vbq1+e/v7u9+trX9+9cL16x9fnk83Seh1DIJdSH4zSN7sJYBC16IVq+QIxq6sltJLkT1kpLRYy6I1qoQqhMGhkSoAMsc04RZ+zkBZtlJNSqbRoKs34nGvK+wLDsfeD/n8sROBeF8o1+c/4247apbHPbJQO/u/887nuXrQaXR8JgNXSk1KiYZXbRQwcBHjgJxlVbKcGra/SZTrkK8NN0TwasNuUJCgu1XmNgvP9LYVwkdS4VC8L9DaaIx6D4bsug6NMGBRB4LtiN+iGvKmcu4vUs0QcuHhLtNpV0PMVRdzamIOVcxWG7NKMzZx1iZItnKX7OxPbaUxOWgpgALgAlqzuPowjjn0aNCiiHXWe408j5a5FDaMhmwT/S2zY0Ftr4XhbWU7dYsnJTDoMg66DIMObcquytixfLtg3MqacbDmXNwZB2O4pfoz995b3TtnTaRJ064uftFCojt3qmPgsDnc0+i1KHpwkdfEi3dpro54ziWdfht6zIayJDuAtRPT0jPdbBhokgzZFaMubLJDfLadlccrRky0mbbyiTZ6oblsaH/ZknX3ik/8kWPvoKo4oqWmjuN9Hn0y2HJxLDCXPJqN9uTC9pm4q3DSFOmRH3ZwG6RbKAAEAAMHjlqq/geI5IHlVX1RHQAAAABJRU5ErkJggg==" nextheight="1150" nextwidth="3074" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://staatsbibliothek-berlin.de/die-staatsbibliothek/die-gebaeude/potsdamer-strasse">Staatsbibliothek Potsdamer</a></figcaption></figure><h2 id="h-socialism" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Socialism</h2><p>I've generally been in the 'capitalism not perfect but gud, socialism sounds gud but isn't in reality' camp but only had a basic understanding of why. Berlin is very socialist so I figured while being here I'd commit some time to reading about it, seeing the sights, and trying to understand it better. </p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b48abe5b0e58aea460d0c0f01188a0e3.jpg" blurdataurl="data:image/png;base64,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" nextheight="1902" nextwidth="3024" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Have worked through these, seen the Socialist Memorial and a few exhibitions, and started dropping into <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.theleftberlin.com/">The Left Berlin</a>. I think I'll write about where I stand on it someday, and I would like to talk if it's something you're interested in too.</p><h2 id="h-good" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Good</h2><p><strong>Crypto: </strong>There are regular events, and Berlin Blockchain week is nice to have here. There's also a couple of dedicated crypto coworking spots, one where I spend most of my time (shout out to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://farcaster.xyz/hellno.eth">hellno.eth</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://farcaster.xyz/df">df</a>, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://farcaster.xyz/levertz/">levertz</a> for being around for most of that time too).</p><p><strong>Falafel: </strong>Everywhere</p><p><strong>Clubbing:</strong> I haven't done much clubbing and didn't expect to, but the places I've seen have been fun. There is definitely no major city in the world that accepts such madness, both in the clubs and on the streets/ <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.berlin.de/en/shopping/4971123-2947095-spaeti-meeting-point-and-supermarket.en.html"><strong>Späti</strong></a>.</p><h2 id="h-bad" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bad</h2><p><strong>Winter:</strong> Everyone says that winter in Berlin is depressing... Can confirm it is dark and freezing, but actually not so awful. There is a lot going on and they have enough interesting indoor events to get through, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.strangerchess.com/">Stranger Chess </a>even migrate indoors to the lobby of a cinema for the coldest months. There are loads of parks so it's usually possible to get a walk around one in the couple of hours or daylight. </p><p><strong>Loud Sirens:</strong> Ambulances are <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/berlin/comments/us7ixq/the_absurd_loudness_of_ambulances_is_it_just/">absurdly loud</a>. Turns out they use horns not sirens so there is no ramp up of noise.</p><p><strong>Door Naming??:</strong> You don't have an apartment number, but you put your name on the door. It's annoying cause to update the name you have to find out the name of the person who was renting before you. Also I'd rather not have my name on the front of the building? I haven't done it yet and just avoid getting mail at home. </p><p><strong>Insane Metro:</strong> Particularly on weekends the metro is crazy, never too busy, but always a complete mess, with a lot of very crusty people.</p><p>Overall I've had a good year (8/10) and I'm glad I moved here. I plan to stay a bit longer and might do another update when I do eventually leave.  </p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <category>berlin</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/ac22e8cc2164189236f36c409c433ef5.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Probability Density Function Library In Solidity ]]></title>
            <link>https://paragraph.com/@jamesmccomish/probability-density-function-library-in-solidity</link>
            <guid>sgY5OUUei9Q9V6jKsQIY</guid>
            <pubDate>Mon, 03 Feb 2025 18:07:34 GMT</pubDate>
            <description><![CDATA[Documenting the process of building PdfLib.sol, a library of probability density functions in solidity, and explaining some of it's features.]]></description>
            <content:encoded><![CDATA[<p>Paradigm recently put out <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.paradigm.xyz/2024/12/distribution-markets">a paper</a> outlining the basics of what a ‘distribution market’ could look like. The difference between a distribution market and a normal prediction market is that instead of buying outcome tokens from a fixed set, you can bet over continuous outcomes.&nbsp;</p><p>That means for a market like <strong>‘How many people will attend the event?’,</strong> instead of being forced into options like <strong>A: &lt;10,000 B: 10,000 - 20,000</strong> etc, you can say <strong>I think 12,345 +/-2,000 people will attend</strong>.</p><p>To do this we needed to translate the traders bet and confidence into an equation that could generate a distribution of points over some interval - ie we needed a probability density function.&nbsp;</p><div class="relative header-and-anchor"><h2 id="h-existing-work"><strong>Existing Work</strong></h2></div><p>When I looked to see if any  probability density function (PDF) libraries existed, there were 3 main stand alone repos in solidity.</p><ol><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/primitivefinance/solstat"><strong>Solstat</strong></a>: Primitive Finance</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/DeltaDex-Protocol/statistics_solidity"><strong>Statistics Solidity</strong></a>: DeltaDex Protocol</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/cairoeth/solgauss/tree/master">Solgauss</a>: Cairo.eth</p></li></ol><p>All the libraries are useful and work under certain conditions, but they lacked some features that we needed.</p><table style="min-width: 150px"><colgroup><col><col><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Library</strong></p></th><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Features</strong></p></th><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Tests</strong></p></th><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Math Lib</strong></p></th><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Pdf inputs</strong></p></th><th colspan="1" rowspan="1"><p style="text-align: center"><strong>gas</strong></p></th></tr><tr><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Solstat</strong></p></th><td colspan="1" rowspan="1"><p>Pdf, cdf, ercf, iercf, ppf</p></td><td colspan="1" rowspan="1"><p>Foundry (with reference tests)</p></td><td colspan="1" rowspan="1"><p>Solmate</p></td><td colspan="1" rowspan="1"><p>variable x </p><p>$$\mu=0$$,</p><p>$$\sigma=1$$</p></td><td colspan="1" rowspan="1"><p>11657</p></td></tr><tr><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Statistics Solidity</strong></p></th><td colspan="1" rowspan="1"><p>Pdf, cdf, erf</p></td><td colspan="1" rowspan="1"><p>Hardhat (minimal reference tests, no fuzz)</p></td><td colspan="1" rowspan="1"><p>PRB-Math</p></td><td colspan="1" rowspan="1"><p>variable x </p><p>$$\mu=0$$,</p><p>$$\sigma=1$$</p></td><td colspan="1" rowspan="1"><p>32869</p></td></tr><tr><th colspan="1" rowspan="1"><p style="text-align: center"><strong>Solgauss</strong></p></th><td colspan="1" rowspan="1"><p>erfc, erfinv, ppf</p></td><td colspan="1" rowspan="1"><p>Foundry (with reference tests)</p></td><td colspan="1" rowspan="1"><p>Solady</p></td><td colspan="1" rowspan="1"><p>na</p></td><td colspan="1" rowspan="1"><p>na (very low for other functions)</p></td></tr></tbody></table><div class="relative header-and-anchor"><h2 id="h-what-we-needed"><strong>What We Needed</strong></h2></div><p>Our ideal library needed:</p><ul><li><p>To generate PDFs for a range of $$\mu$$ and $$\sigma$$ . The constraint of $$\mu=0$$,</p><p>$$\sigma=1$$ was too restrictive.</p></li><li><p>To be able to operate on different scales. So people can predict values on the order of $$10$$ or $$10\space eth$$</p></li><li><p>Utilities to relate multiple PDFs (like finding the point of maximum difference between 2 PDFs)</p></li><li><p>A test framework that could link to our other code related to the distribution market.</p></li></ul><div class="relative header-and-anchor"><h2 id="h-adapting-a-pdf-for-solidity"><strong>Adapting a PDF for Solidity</strong></h2></div><p>Solidity <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/types.html#fixed-point-numbers">does not have built in support for floating point math</a>, so any values that have decimals would get cut off. The worst form of this is when a number is a decimal less than 1, which just gets rounded to 0, something that is obviously bad for a PDF which has terms like $$\frac{1}{\sigma\sqrt2\pi}$$.</p><p>To get around this we scale all our numbers up and work in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.rareskills.io/post/solidity-fixed-point">‘fixed point math’</a> where we assume a huge number like $$1e^{18}$$ actually equals 1. That’s great because now instead of rounding numbers like $$\pi\approx3$$ we can do</p><p style="text-align: center"> $$\pi=3.141592653589793238 * 1e^{18} = 3141592653589793238$$</p><p>So any time we see a number like that, <strong>we need to remember the amount we scaled it by</strong>, and be careful to either operate on that scale, or convert it back down offchain. Scaling numbers like this is straightforward when we just want to do simple operations like adding or dividing numbers. But the PDF is not so simple, and if we are to work with scaled numbers, we need to see how it behaves for different inputs.&nbsp;</p><p style="text-align: center">$$ p(x) =  \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2} $$</p><div class="relative header-and-anchor"><h2 id="h-a-scaled-pdf"><strong>A Scaled PDF</strong></h2></div><p>Looking at the above equation and thinking back to our original example of predicting attendees at an event, we can gain some understanding of how the PDF should scale. If we consider a normal event to have 100 attendees $$\pm20$$, then we can work out the probability that x people will show up. One thing to notice is that since <strong>all those parameters are measured in attendees, if we scale things, then scaling all of the parameters by the same amount makes sense</strong>. </p><p>Since the exponent $${-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}$$ has equal orders of scaling in the numerator and denominator, any scaling cancels out. The <strong>coefficient has a sigma in the denominator, meaning that scaling the inputs will produce a much smaller peak</strong>. This aligns with the normalisation constraint on PDFs, $$\int_{-\infty}^{\infty}{p(x)}dx=1$$, since when we stretch the range with our scaling, the height must get smaller to keep the area the same. </p><figure float="none" width="731px" data-type="figure" class="img-center" style="max-width: 731px;"><img src="https://storage.googleapis.com/papyrus_images/0399dce40a2ecc88902c06e9b3dd1fba.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAASCAIAAAC1qksFAAAACXBIWXMAABYlAAAWJQFJUiTwAAADIUlEQVR4nK1Vz2vUQBTO/9CLVr2slBaKWC8aUeta7baIYjxY4o9CUUQpHnSOCxV0VRCKh7I5eRgF7Q4BXRuRssZ60Gmq4IYU7E5tS9O+LWW301W0zF4ju4MxWry0fuQw817e++a9b/KiKIryZW5uwnFs26aUIoR0XWeMBUHw7j1NJpOUUsYYpdR13ejadV1WhzTK7XqXoihKPv9pOJNRVbW/vx+gOD39ZXW1srpayec9jB8xxgBAxriuG66lXW4BIPpa1KVs2bo9+2JkOJNZgKXyCvcXFsMn99pOJpPRpBshOHdWp/S9Zb3MkOfzvr9ULEofAFBKMcaMMc65jImuAYDXIY1yu96lqKpq18E5XyoWR3Nv6PjHkB9jvNkKuru7bdu2LEsIwTnP5z1/YVHyU0oNwwiThvGhkrMzM0vFYqhqlECepiaypmm0DgCY933OVx4/MacK7Gul4rruvbt3JxxndmYmTFoql6cKBRmfzWYNw3g1OgoAE44T5f5dgfELQRB8rVSEEP7C4vi4Qym17ZrIU4WCTPpjbY0xNpbLPctkHqbTx48da2tp2dPaeuXixbFcTiox7/vfvn+f931CyODgICFEQQhJTcQvUEo1TYvH4wgh0zSzpvmB0vt3bp/o6DjV1XXt8uVLvb3poSGMsWma6QcPTiYSu5qbd27b1tne3r5/f8/p0zsaG2OxWENDQ1tbW00DQohsuhBr5RX+uTAtxFq1WjVNU4lA07SOI0euXL164NChnp6eRCKh6/rRzs4Lvb1Ph4cHBgbSQ0OtTU3nz5zpOHjwVFfX4X17d7c01yKDIJBF2LZ9/Qa6eesO5ysA8HZsDGO8XCotl0pThYIQAgCEEOG9lJboDZb9LJXLADDpeROOUyMwDANjrKoqxjiVSo2MZIM6OOfRD23S88KpEJ0Hf13TSc+b9LzfImOMLcsidXDOq9VqKAZjzDCMzY4KOc4AQJ5appbHJ4REv4MNEiCEbNt2XVf8Cc65ZVn/gSCVSknregKMMSEkOmQ2Mov6+voQQv+qACH0H/4H8Xhc9l0CAHRdj8VisnubnKY/AVxLI4TfHVGkAAAAAElFTkSuQmCC" nextheight="1796" nextwidth="3204" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">If we scale the inputs of the f(x) by 2, the height of g(x) is 1/2 of f(x)</figcaption></figure><p>But in Solidity we are actually going to be working in fixed point math where $$1e^{18}=1$$, so we need to scale our inputs to convert them to this number system, and also need to consider the other constants like $$2$$ and $$\pi$$ in the same way. This is why we use a library like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/PaulRBerg/prb-math">Prb-Math</a>.</p><div class="relative header-and-anchor"><h2 id="h-prb-math-sd59x18-number-type">Prb-Math SD59x18 Number Type</h2></div><p>Since we want to be able to work with negative numbers, we choose the (signed decimal) SD59x18 number type from PRB-Math. This lets us operate with 59 integer numbers and 18 decimals by representing those numbers in the range of an int256. </p><pre data-type="codeBlock" text="/// User defined type to ensure we know we are operating with a custom number type, not int256
type SD59x18 is int256;
// Upper bound is type(int256).max
int256 constant uMAX_SD59x18 = 57896044618658097711785492504343953926634992332820282019728_792003956564819967;
// Lower bound is type(int256).min
int256 constant uMIN_SD59x18 = -57896044618658097711785492504343953926634992332820282019728_792003956564819968;"><code><span class="hljs-comment">/// User defined type to ensure we know we are operating with a custom number type, not int256</span>
<span class="hljs-keyword">type</span> SD59x18 <span class="hljs-keyword">is</span> <span class="hljs-keyword">int256</span>;
<span class="hljs-comment">// Upper bound is type(int256).max</span>
<span class="hljs-keyword">int256</span> <span class="hljs-keyword">constant</span> uMAX_SD59x18 <span class="hljs-operator">=</span> <span class="hljs-number">57896044618658097711785492504343953926634992332820282019728_792003956564819967</span>;
<span class="hljs-comment">// Lower bound is type(int256).min</span>
<span class="hljs-keyword">int256</span> <span class="hljs-keyword">constant</span> uMIN_SD59x18 <span class="hljs-operator">=</span> <span class="hljs-number">-57896044618658097711785492504343953926634992332820282019728_792003956564819968</span>;</code></pre><p>Using this number type allows us allows us to calculate the PDF from the $$f(x)$$ curve in the Desmos graph above for inputs: $$x=3, \mu=2, \sigma=1$$ </p><pre data-type="codeBlock" text="function pdf(SD59x18 x, SD59x18 mean, SD59x18 sigma) returns (SD59x18 p) {
/// x - µ = 1e^18
SD59x18 xMinusMean = x - mean;
/// -(x - µ)^2 = -1e^18
SD59x18 exponentNumerator = -xMinusMean.pow(TWO);
/// 2σ^2 = 2e^18
SD59x18 exponentDenominator = TWO.mul(sigma.pow(TWO));
/// full exponent = -5e^17
SD59x18 exponentFull = exponentNumerator.div(exponentDenominator);
/// e^((-(x - µ)^2) / 2σ^2) = 6.07e17
SD59x18 exponentResult = exp(exponentFull);
/// σ√2π = 2.51e18
SD59x18 denominator = sigma.mul(SQRT_2PI);
/// 1 / σ√2π = 3.99e^17
SD59x18 coefficient = inv(denominator);
/// p = (1 / σ√2π)e^((-(x - µ)^2) / 2σ^2) = 2.42e^17
p = mul(coefficient, exponentResult)
}"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">pdf</span>(<span class="hljs-params">SD59x18 x, SD59x18 mean, SD59x18 sigma</span>) <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params">SD59x18 p</span>) </span>{
<span class="hljs-comment">/// x - µ = 1e^18</span>
SD59x18 xMinusMean <span class="hljs-operator">=</span> x <span class="hljs-operator">-</span> mean;
<span class="hljs-comment">/// -(x - µ)^2 = -1e^18</span>
SD59x18 exponentNumerator <span class="hljs-operator">=</span> <span class="hljs-operator">-</span>xMinusMean.pow(TWO);
<span class="hljs-comment">/// 2σ^2 = 2e^18</span>
SD59x18 exponentDenominator <span class="hljs-operator">=</span> TWO.mul(sigma.pow(TWO));
<span class="hljs-comment">/// full exponent = -5e^17</span>
SD59x18 exponentFull <span class="hljs-operator">=</span> exponentNumerator.div(exponentDenominator);
<span class="hljs-comment">/// e^((-(x - µ)^2) / 2σ^2) = 6.07e17</span>
SD59x18 exponentResult <span class="hljs-operator">=</span> exp(exponentFull);
<span class="hljs-comment">/// σ√2π = 2.51e18</span>
SD59x18 denominator <span class="hljs-operator">=</span> sigma.mul(SQRT_2PI);
<span class="hljs-comment">/// 1 / σ√2π = 3.99e^17</span>
SD59x18 coefficient <span class="hljs-operator">=</span> inv(denominator);
<span class="hljs-comment">/// p = (1 / σ√2π)e^((-(x - µ)^2) / 2σ^2) = 2.42e^17</span>
p <span class="hljs-operator">=</span> mul(coefficient, exponentResult)
}</code></pre><p>As you can see the result is $$2.42e^{17}$$ , which if you consider $$1e^{18}=1$$, is the same as saying $$0.242$$. This agrees with Desmos and shows that we don't have to lose precision when working with decimals in Solidity. </p><div class="relative header-and-anchor"><h2 id="h-implementation">Implementation</h2></div><p>The library includes the following functions:</p><ul><li><p><strong>pdf</strong>: The probability density function</p></li><li><p><strong>pdfDifference</strong>: The difference between two pdfs</p></li><li><p><strong>isMinimumPoint</strong>: Checks if a point is the minimum point of a curve given by pdf2 - pdf1</p></li><li><p><strong>isMaximumPoint</strong>: Checks if a point is the maximum point of a curve given by pdf2 - pdf1</p></li><li><p><strong>pdfDerivativeAtX</strong>: The first derivative of a pdf at a given x</p></li><li><p><strong>pdfSecondDerivativeAtX</strong>: The second derivative of a pdf at a given x</p><p>These functions have wrappers like the below to receive values in int256, so you don't need to import any Prb-Math types into your code to get values back. </p></li></ul><pre data-type="codeBlock" text="    function pdf(int256 x, int256 mean, int256 sigma) internal pure returns (int256) {
        return pdf(convert(x), convert(mean), convert(sigma)).unwrap();
    }"><code>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">pdf</span>(<span class="hljs-params"><span class="hljs-keyword">int256</span> x, <span class="hljs-keyword">int256</span> mean, <span class="hljs-keyword">int256</span> sigma</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">int256</span></span>) </span>{
        <span class="hljs-keyword">return</span> pdf(convert(x), convert(mean), convert(sigma)).<span class="hljs-built_in">unwrap</span>();
    }</code></pre><p>All tests are run against reference PDF values calculated in typescript like the below.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5224736ea9b39068e787d6e52f437f89.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAABYlAAAWJQFJUiTwAAACxUlEQVR4nGMQ0XYKTWmt71/Xu/TIprPvTjz+v/LInbrpixfsPheQWRGQUxaUVeufXm/kGxVZUs+ras0qZ6Rg7l/dvtYtrMwnoTGtfknb/GPx5bMNXaK7F+/PbV+y8vi9tMppEXmtGg5hDCLqDAwi6kxSBhYBCUF5dV4JzYHJ7cE5LX7JNVH5rQn1HXE1E4x9EoS0HPk0rCSMnBhENQU17blVLFQtg1QtQ9TtomxDi7ySmmxDi/Rdk4KzemPLpoTl9wVltjpHFUgYuDHwKTKwyhkxiKhFF3f6pzc6hKQmlDSzyhkKatpIGTiL69kLatoIaFiL6toJatoIa9qyyhkKaTkKatr7xdblNy1PrVuw/NCbaetvzN/9dPf1/3uu/9977feUtRduf/+//ODzjMb5mo6RUAtmbztXO21rXEHznrNXV+w8vHbficC0Uu+EQu/4PLeorKC0cs/4vMC0UhkTd24VC0FNewkdN341e12XJBFtJ1WbsLD8iV5JTV5JTXquyRyK5kxSBhyK5pDwhFigHlPcHVPS5xxV2DH/YOv8wyuO3IurmMTAp4yJBDXtWeWMHMPL1p/8dO71/7UnPvavuFI9dcuq/ZfyOpZq2MUwiKiBgh5EghkQHzTP2ZZQPiW5fNLua/+3Xfq/+tSr5KoJDKKaYKVQxCipzSCiJmHgLqhpr2IT0rJgd9u83RNWHVexCWEQUWOR0WUQVoGZjoSYpAwYRDVdEnJCcmrdwsrcYspcokuDMjs8E+usgjIYRNRY5QyRNKiJ67tyq1hk1s2s6FnRv/zE5FVHI/LaQIagmQtHkCDK7ZiyaN/x6WtPpNZM9cmsq5uxu2PxidDcZrvIxIzWPn4NG7gFvKqgOBfQtOVXs7cKSlcw92VgkMJpOsQHTFIGpu6ptn45XimVGo7h4NDQgQWLDgQh+0BQ0x4aGmASSRYLAgA6hAHI7pTDFQAAAABJRU5ErkJggg==" nextheight="704" nextwidth="2412" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>You can find the code <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/jamesmccomish/pdf-lib-sol">here</a> and if you have any questions drop me a message on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/jamco.eth">farcaster</a></p><p></p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <category>solidity</category>
            <category>smart-contract</category>
            <category>probability</category>
            <category>library</category>
            <category>code</category>
            <category>evm</category>
            <category>ethereum</category>
            <category>math</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/84dd08c1f42feb7f54473ab18f9a0b8a.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[First Month In Berlin]]></title>
            <link>https://paragraph.com/@jamesmccomish/first-month-in-berlin</link>
            <guid>aYIK926MtRs84mKGfU1n</guid>
            <pubDate>Tue, 01 Oct 2024 16:57:14 GMT</pubDate>
            <description><![CDATA[It’s been 1 month since I moved to Berlin. Overall I think it’s a great place and I can see myself staying here for a while, which is strange cause there are many things that when reviewed separately are quite negative. It all kinda works together tho...]]></description>
            <content:encoded><![CDATA[<p>It’s been 1 month since I moved to Berlin. Overall I think it’s a great place and I can see myself staying here for a while, which is strange cause there are many things that when reviewed separately seem quite negative. It all kind of works together tho.</p><figure float="none" width="702px" data-type="figure" class="img-center" style="max-width: 702px;"><img src="https://storage.googleapis.com/papyrus_images/1207b01842b6886dd8090e3ddd4dc4fa.png" blurdataurl="data:image/png;base64,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" nextheight="824" nextwidth="1237" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Berlin looking well, mid September</figcaption></figure><p>One of the first things I noticed was the amount of litter in the streets and parks. I'd say the worst areas are on par with Marrakesh or NYC as the most dirty cities I've seen. There are parts of Kreuzberg that almost pull off the trashy look as it fits with the run down graffitied streets, but seeing so much litter blow around the parks is a shame. Attempts to encourage recycling seem less effective when the streets of the city are so bad. The extra charge on bottles/cans is annoying since you only get the refund if you taken them to one of the central recycling centres in a big supermarket. Recycling them in bins on the street means I end up paying more than I should for most drinks.</p><p>I haven’t seen the darker months of winter so maybe I don’t fully appreciate this yet, but the streets are noticeably open and bright. It’s a nice feeling when cycling around since many pavements have space for a cycle lane, pedestrians, and terraces in front of cafes. Looking into it more showed that strict <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.berlin.de/umweltatlas/en/land-use/building-heights/continually-updated/map-description/">building laws</a> which were written in 1853 make it difficult to build anything over 22m. For some reason they decided to maintain those limits when rebuilding Berlin after the war, resulting in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://storymaps.arcgis.com/stories/2fbdad832eab4e7c8253dbdcac8cbcc4#ref-n-w9Uihq">a layout</a> that’s nice in the residential areas, but limiting the development of any sort of recognisable skyline.&nbsp;</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4fe24afe41e07bee6d54b1bbff16e72d.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAOCAIAAADBvonlAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEBUlEQVR4nFVUUW/aVhi1ZilEUVgYRF5Sli5pQgo0lEAoiQlkoWKDLAQECyEKquVQate4dm3jGHszBAMJI02ybovatdU0KZs2rZnUbZo09WXanvY0aX9i/2HSXiZzU6uVvod7feVzzvedow/awnBBlLBiiSyX9z/u4CUCNln7Bmx9A7Z+MwKbrFbEXqIoVhAKOI4TBC9VeGmHFQSjaI4lGYbmWOPKSzu8tAO+QIm19M1bZCy+kt3YwIqlG9s3+83DfQPWPvMwBA1AsBkQ8NJOdjNfpEhW4FlBABwAotVpnzz6rKbVGY4zcMErzbHQlHPG5fF554IL4fBlt2c2MC8p1TJzhyyXb2xvWxH7kO0CINjEMKMDQyM4/PvfP3/9/QdGEJxUAQQAXSdweXwBNBRAQ0vR6OLSciyeyOQ2Utn15eux1XR6yHbBICAZehPDRFnCCSKdy0mKDCSLilzT6jWtfg7da7F30F8h5xXv4tJyNBZbXFpOJFPNvRZfETK5nD+44A8u9JuRFyOqkAyDEwQrCKHo9Vt3qO5Rl+Y4mmNFWTLG9Wrx5x2g4ciEw+Xy+KacM+OTl8cnnVPOmWm314rYYZPFiti3KUJX2tMeT6aS2Q9UrU4yNJgPKwicVHkZ2nCCFnjIhrzVb0YgaBB6zQzBZthkgWCzfoUGYZMFNlmGRy4aMjcxbL1QABC37+oQoiIDjh6ZTvNyhPQUXXK4/UEUDOTKrG/a7Q2gIX8Q9c4F0XBk0DJiReyNdqPR1ooUVcDx3p88ydAkQ3P63Gha4D/UduW6YjCJiiwq8rnJM7MB71zQO3dtPhxJZdczuVwsHvcHF1we/4TD9Qaim1ykKLmhApPbB3uqVq+qSk+7nhmSoWvNXSO7JMM02s1Wp81LO6pWh1bTGbEqbWF4NPYeWS4z3N3VdKaqyLL60RaGQ/DQ8MhFMO6qqqhaff+gI8oSw3EAC3RAc6y2p6lanRWE7vEBYPru7PSTk2PIF1jo3juIxRPz6GIADU27r0beWX5/LZVIJhPJVL8ZGR2bPPz0UFTkEnW7B0rrflT0ULU67VanJcoSV9HlS0r1/oPj3/98/uirh0BQq9OCXB7/uysrATSEhiNL0evz4cg1dNF91Tc+6QQmWxE7ydBFiswVCgCOFYRGu1lr7jba2uMvH5w9+7aqKt2j7pPTL57/9nNVVY4+PxRliWSYk4f3odGxyQmH65LDPeFwjY07ppwzb46+DcGvwyZL34DNIIgn17KbeWNDiLJUVZXenmj99OvTH395Wmvufv/D12fPvnly+rhEUTSnbyecICAIHnq19KSCZfeCYKxIUZl8HmwhYCbJ0Kwg7B/sA6WqVhdliRZ4VavXWrvAIVrgMvn8/zmp3AUyBm0lAAAAAElFTkSuQmCC" nextheight="1402" nextwidth="3262" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://storymaps.arcgis.com/stories/2fbdad832eab4e7c8253dbdcac8cbcc4#ref-n-PSbDLB">Cool website</a> exploring building heights in Berlin</figcaption></figure><p>The tallest ‘building’ in Berlin was built in 1969, and it’s really more of a TV tower than an actual building. Seems crazy for the capital of the 4th largest economy in the world to have never made an effort to build anything tall - second place is 125m and was also built in 1969. Frankfurt have all 10 of the tallest buildings in Germany, then cities like Cologne and Munich start to have a couple, but Berlin, for its much larger population, is mostly left out. Wether its bad management or difficulties from the reunification in the 90s, Berlin seems like a historical capital that didn't really really keep up with the rest of the country. It's now <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.weforum.org/agenda/2016/08/only-one-european-country-would-be-better-off-without-its-capital-city/">an old report</a> and I couldn't get newer figures, but in 2016 Berlin was the only capital city in Europe that if removed, would result in an increase in the GDP of it's country.</p><p>Another way it seems Berlin is stuck in the 60s is the amount of shops/cafes that take only cash. It’s surprising, and not something I’ve noticed in any other EU city. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://foreignpolicy.com/2023/08/30/germany-is-hopelessly-addicted-to-cash/">A mix of things</a>, from lingering paranoia caused by crazy currency devaluations in the 1920s and 1940s, to social stigma around debt get the blame, but whatever it is, it could be the right environment to test better crypto payments. Especially for the smaller retailers who often set high minimum spends on card to save on fees taken by banks. There’s at least <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.townmouse.de/">one cafe</a> taking payments in USDC and given the number of dedicated web3 coworking spots, that'll hopefully increase.</p><figure float="none" width="618px" data-type="figure" class="img-center" style="max-width: 618px;"><img src="https://storage.googleapis.com/papyrus_images/bbd253edf50a87ecb83cda77a6c5e50f.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAECAIAAABgJaqDAAAACXBIWXMAABYlAAAWJQFJUiTwAAABY0lEQVR4nGM4cGD/7Nmztm3evHjRwn17d0yZvVjUIlDWNkzZKVbXL1PSMkjY1E/cIlDRMUrNPUnfP1vSMljZKVbRMUbRMUbNPUHRMUbU1E/WNgwk65el7Bit6Bhz8uLt//////795////wz13TNlzbwcw3JMfRKtAlJVnGIYpK0YJMwYVNwYFB0YFB0ZpK0ZVFxBDDlbEJK2BHMdQKSaO0hczBSkRtqKQcyMQdaOgUNXxy8zoqjTNrKwZeoqBu+kSgYGaQZeXQZ+IwY+AwZRM5BSOVsGTU+QNmVnEFfREWScihsDvz4Dvx7IdDETkKCoMYOcHYOmF4ir4sogZxNd1BFb0BKY1eQeV2bgGdc8aRlDQW0vs5aTrneyrneqsn2EpEWgsKmPvF24hkeSuIW/vF24omMkv76HhkeismOMhkeSpEWguIW/pEUgr44rv76HqKmfMjiUmNRsDLwTPnz69h8VAACmAm8cBvtnlgAAAABJRU5ErkJggg==" nextheight="314" nextwidth="2380" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vitalik.eth.limo/general/2024/01/31/end.html">Vitalik on early Ethereum</a></figcaption></figure><p>Ethereum's early development was centred in Berlin and some of the first projects like Gnosis/Safe are still based here. The messiness and lack of drive at the state level seems to leave room for communities to form and get on with their own thing.&nbsp;Since it looks like the place is falling apart, you get the feeling that if everything was to go to shit that many people here would just keep going with what they’re doing. Maybe this is what gives the other lacking parts a positive take. I've enjoyed working at a few coworks (finally settling on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.betahaus.com/">Betahaus</a>) and there is a bigger tech ecosystem than in Barcelona, with pretty much daily meetups for things related to work or not. (Fun <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.strangerchess.com/daily/">daily chess meetup</a> in Prenzlauer Berg)</p><p>I was lucky to catch the end of summer since apparently the winter is quite brutal, but I’m pretty excited to see what it’s like. Looking forward to meet more people working in crypto and explore wider tech events too.&nbsp;</p><p></p><p></p><p></p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/b71f23807d3a68be49002cb7a7231a64.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Making Smart Accounts Easy To Use For Developers]]></title>
            <link>https://paragraph.com/@jamesmccomish/smart-account-dev-experience</link>
            <guid>l8abyYTw1hmG4j0gFYlR</guid>
            <pubDate>Sun, 14 Jul 2024 12:27:17 GMT</pubDate>
            <description><![CDATA[The transition from EOA to Smart Contract Account (SCA) is a huge win for users, but what does it mean for developers? Having a more versatile accoun...]]></description>
            <content:encoded><![CDATA[<p>The transition from EOA to Smart Contract Account (SCA) is a huge win for users, but what does it mean for developers? Having a more versatile account is great — yay for everyone building passkey multisigs, session keys, and modules — but it is useless if no dapp knows how to interact with it. This article lays out some useful things to think about when building for the new account type, and introduces the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.pimlico.io/permissionless">Permissionlesss</a> <code>toSmartAccount</code> helper.</p><p>A brief look at the current transaction flow for an EOA is a useful place to start, since if our SCA can maintain a similar flow, then both account types can exist in parallel while the transition happens. This saves a lot of code from being rewritten as we can keep using existing hooks in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wagmi.sh/react/why">Wagmi</a> like <code>sendTransaction</code>.</p><figure float="none" width="903px" data-type="figure" class="img-center" style="max-width: 903px;"><img src="https://storage.googleapis.com/papyrus_images/4a4d2825e48f3ac176db8e2da8b19fcd.png" alt="Current EOA flow when sending a transaction" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC4klEQVR4nG2T/0sTYRzHn3/AXxox0F8D/cFIbFFhsB8iVuIPQmGJEGWkUMaEE7ZgyCEphgoOFBmHjHnJam5m0325TZ/W7dbOR25ut01Xd6JMZRfOmTMtZrBoJ/5gvXh4+PDhgc/78/m8H1AscZDPuxwO89gYSRAuh2NDFCMsG/B4Ah7PSjQaYVm/05nk+eI/8CuC3fvJFUCuAPIHlwqFQrFYPL0LhQKQ36XX163j409bWroxjPZ6AQA9ev3O1pYYi12qrOwzGNKplI0ko9GoVqvt7+83GAw6nZ4JBucWgu5F3ofiFOLtPubo6OcZBWAnm8t9P1gTBARhTpJykrSxugoAeNDYeLC3x9F0hULR2ty8LYpdWu3Q0BBWQqvV4jh+W6MxvBqg4199KO5DcYefkVVjGJZMJo1GI47j4P7dO7fUNR63N7YYTiCUWl6esliIkZE+gwFBOGEymYaHF2bnOJpmafqMut/Hx+Fo0hmKeMIxuYDcQXl5uUKhAADU19eDm+orN65esL21hShqmiSnLJYPViuPUAIhBOFqJLIpCBxNIwi/JBK/CoVvkpQtkclkDvJ5Nrbaib9+2NHV9OSFyfpenv5f4QAolUq73Q4uq66dU1b4fb4Jk6lHr5dPZ1vbhMmUk6RHTU3Xa2u3RZFnmItVVY9bW6urq2tqaurq6lQqVcfzZ05fwBmK2CjG5gufjggAgGGYSqVSq9Vgv8SaIHChkLyDTUHoxrBJgshJ0r2GhvNlZelUKp1K9eI4hFCn0+E43t7ejuP4G5Ik7bNweWV+KTG/lHD4Q9ls9vDwRyaT2d/fl7s8cdGaIIQoimcYjqYnCWKaJAmjMeByLczO+Z3OSDCIICRGR2manilhtVoh/PhSr+/uHaSTgvtz1L3Iv3MHBgYHMQzTaDQQQrPZTFHUSYHc7m6c45IcF2VZOUjFYkmOi3NchGXl/IYo/vcfzMyHvAznZbi5hSBBELLTTm36BxW7XvKgWEJmAAAAAElFTkSuQmCC" nextheight="721" nextwidth="2561" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Current EOA flow when sending a transaction</figcaption></figure><p>When a user on a dapp decides to take some onchain action, a transaction ({<code>to</code>, <code>value</code>, <code>data</code> ...}) is formatted and a wallet is requested to get a signature on that transaction data. The wallet will then (in the case of a "local account") ask some secure store for access to the private key which could be stored on your browser, device, or keychain. If you have permission (by passing a biometrics or a password check) then you get a signature on the transaction, and that signed transaction can be sent onchain. </p><figure float="none" width="554px" data-type="figure" class="img-center" style="max-width: 554px;"><img src="https://storage.googleapis.com/papyrus_images/6b757b0f6eac6d607599207c70a8a5b3.png" blurdataurl="data:image/png;base64,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" nextheight="721" nextwidth="1074" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Basics of an EOA wallet</figcaption></figure><p>With a smart account we can define much more flexible logic related to signature validation or transaction execution, but this means we have to extend the basic <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://viem.sh/">Viem</a> account API (seen above) to handle that. Below we have a very simple example of the interface an ERC-4337 contract might have, and some important considerations when designing the account.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1e7ea339129271a5e79ce80f42f3fb95.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAICAIAAAAX52r4AAAACXBIWXMAAAsTAAALEwEAmpwYAAACbklEQVR4nGXQ20/TUBwH8CNQtg7H1tL2nJVe1vY8aKL/BwkxBBWN4gMkauI/hSYCD4TLRkjAFxKeCKiZWxgXh4PdR+3aMR0wtq6mGyZekk9Ovuf78Ds5P2CZV4VcrZivZU4qVqXZVTValtG8rLe3tj7NvF2YnV95P7fUNdcN88uu3+VfuWN2fmXm3cLm5g4wvzfSKTOTNtPHRkVv1izbVbVNvdVuOhMTrwFgKHaY40I0E/IHeS853D/I+RjUT0EvjXw0us2GfAzyUrDPz4Je5oaHA+DWyOgLYBmNYu68kK1+S+nplJE9MTMn5mEyX8jWHNt5PvnG75ME6a6sYEXVeFGlOZliJYqTgqxEse75vwAr0TAMCHrs0TSo6Bd78dO9L5n9RDYRSx8k818PyqnDUil/6djOxNOXoJehpDs0r/LDYV5UBEmFMCwiFUFFQFqQEQNDYvCGEBgSug3NyaA3+GB8Chj6RcKdnjvaLyRi6WQ8X8z90EtXeun65gEPS+P7SMQYa1jBOIyxgjUFcyGZRwqCMoIyhLKAFB4pLCcJbqnIIXWQhO4D5UItGc8dJvOxz6nYx+Ojg9LO9n4yfnpWbDi28+TZK0ByDL4XkrCqakoYK5IW5jWB15A70f1HF48UAakQqQFWDLJiZ0XU2MMpd0V66cooX5fyF+VC/ax4WS7Ua5ZtGXa76Yw/ngagjwjyPQOQGGA9fkj4WY+H85Ccl+R8JCRI2M0eEnavgGABwfaQEABiZHQSVK1G1Wi5zNa56YZz07aMZkW/rv9s7+7GF5fWotH1SGR95U/Rjn/Kjkh0IxLdWF39sLi8tr0d+wVel19Fsets2gAAAABJRU5ErkJggg==" nextheight="721" nextwidth="2741" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>First thing to note is <code>initialize</code>. This exists because unlike an EOA, the SCA will eventually need to be deployed on each chain it wants to operate on. Generally each type of SCA will have a corresponding "factory" contract which can deploy copies of it. With that in mind we can define a few useful methods that we need to add to our previous Viem account to convert it to a smart account.</p><ul><li><p><code>getFactory</code>: Get the address that will deploy our account.</p></li><li><p><code>getFactoryData</code>: Data that the factory will be called with (maybe to set an owner address on the account, or give the contract a name)</p></li><li><p><code>getInitCode</code>: Combines the above two things into one.</p></li></ul><p>Next we have <code>validateUserOp</code> which allows us to define custom validation logic on our account - where <code>userOp</code> is the new transaction object for ERC-4337 smart accounts. This custom validation is usually in a function called <code>_isValidSignature</code> which can also be used for ERC-1271 contract signatures. Because of this we have to adapt our existing signature methods on the Viem account.</p><ul><li><p><code>signMessage</code> &amp; <code>signTypedData</code>: These need adapted to not just sign the message or data, but to structure the data to match the way the contract implemented it's <code>_isValidSignature</code> check. Since most ERC-1271 contract signatures adhere to ERC-712, we will wrap the message with some "domain parameters" - things like the verifying contracts address, chain ID, version of contract etc.</p></li><li><p><code>signTransaction</code>: This is no longer used as we don't directly sign transactions anymore!</p></li><li><p><code>signUserOperation</code>: Sign the new transaction object instead.</p></li></ul><p>Another difference we need to deal with is the fact that the EVM does not increment nonce for an address with code when a transaction occurs (only when that that address creates a new contract). Because of this the <code>EntryPoint</code> contract, responsible for handling ERC-4337 transactions, keeps track of the nonce of SCA wallets so we add a method to check that.</p><ul><li><p><code>getNonce</code>: Call the entrypoint anytime we want our accounts nonce. </p></li></ul><p>One final thing is that since the smart account will make it's call through the <code>execute</code> function, we still need an EOA somewhere to initiate this. For that, Account Abstraction providers are running 'bundlers' to relay these <code>userOps</code> onchain, so instead of our transport being a node URL, it will be the URL of whatever bundler we're using. With all that together we can start to see the updated smart account.</p><figure float="none" width="525px" data-type="figure" class="img-center" style="max-width: 525px;"><img src="https://storage.googleapis.com/papyrus_images/fa472d0ad9cf5a90c69c065126e4af80.png" blurdataurl="data:image/png;base64,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" nextheight="1111" nextwidth="1476" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Basics of a smart SCA wallet</figcaption></figure><p>Thankfully <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.pimlico.io/permissionless">Permissionless</a>, the open source smart account framework from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.pimlico.io/">Pimlico</a>, have great wrappers already put together to make this as easy as possible to do in typescript. They conveniently extend the Viem account with all of these functions and more. On top of all that there are some added utilities like <code>getDummySignature</code> which help with gas estimates for userOps. With everything in place, we can complete the picture of how the transaction flow for a smart account will look.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0baa5b5829f788ed35b3f9e22d1ef3da.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC2klEQVR4nHWR70sTcRzH70+QYGBEBOUDWREGopXJ+iHMFuHCB0ZMOGquTThhiKmHuHKIMkxd5rSJDJtruFhy25pb1zmnN3fzdLrbj6vtMtli/TgDnyxwShfbKCrr9egL3+/n/eL9+QJrBGE1mRCLBbFYMKczk8lwB1gjQ3Yb5vUQhH8dXyK9HsL5cuHzpy/cf8j+BoA5HG0KhUwi0fb1YTYbhqIqlUqtVqtUKhiGGYYJBALmads6GdMOTqi6NNLbSv2YyeXwhTZiHMft7+3nE/cKh4MmALXb31FUiCC2YrFHGs3dpiYQBKVSKQiCcrlCr9eLRKKe+wMT4zMV5RcvCUTXr92sFzcap5BEfOufiRzHgSBYVVUFwzAAALkGUZKMkuSKx7Pkdn/d3v5rJpPJuByLmJvo6x0R1oiVLV0uh882uxCLJgoPdnZ2gsENkgwmk6mCAEGQXDQAKJVKAMcwi8FgM5uNOl3A600lkzRNp9PpZDKJ4zjLstlsFkMJqLnzhlgCNXfUixuFNWLdY2OhAcuybvf8Mr4eoeKvX3nD4QjHcVKptCAoKirKraizpeVhb29/d3dFWVmtUFhZWVlXV8fn84uLi0EQ1Ov1U4bn91p75LLWI4dL+KXlClnbxPhMQRAMbkQopulO8/lzAh++ujDv4zhuNA9N07kGqN2eisffhkLpzU2LwdDZ3g7DMARBcrkCgqBAIKDVametLrPJrunXjY5MaQcnnxkRqwVdW6V2d78ZjWaZFDrJLys5UXrl8tXhoVGn04miKJKHoqicwI+ifhTF5+ZsZvMLqxXHcc9PorGoWq1+oBo4fers8WP88jPVvENHqy/USm4pnoxNDg8PCQSC6aeWCMUktz56PURHe0dDQwOPx0MQhGEYmqaB94lEaGUlEgxSJPkmHC780p98J/xBDPX58FWvh1hcIDF02W7DPqTShWuWZf1+ch5bjEZi2Ww2k+fX8A/0j1c9XedYAQAAAABJRU5ErkJggg==" nextheight="727" nextwidth="2640" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Since the flow between application and wallet is identical to that of the first EOA example, it means we can maintain the same code as we have for EOAs! We keep the new formatting and added account functions in our extended Viem account, we keep the same Wagmi hooks for interacting with a wallet, and we let a bundler handle the forwarding of the userOp onchain... so in the end the developer experience for building with SCAs is similar to EOAs, and the end users benefit from a more versatile and secure account.</p><figure float="none" width="525px" data-type="figure" class="img-center" style="max-width: 525px;"><img src="https://storage.googleapis.com/papyrus_images/21aebaaa900516ac87e4672ce030d321.png" blurdataurl="data:image/png;base64,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" nextheight="500" nextwidth="697" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p></p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <category>smart accounts</category>
            <category>account abstraction</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/99171a37075ecc87c083c41a4d5f7acc.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The Retroactive Goods and Bads]]></title>
            <link>https://paragraph.com/@jamesmccomish/the-retroactive-goods-and-bads</link>
            <guid>IT09iP16jFnhwy1HiiES</guid>
            <pubDate>Sat, 13 Jan 2024 16:55:22 GMT</pubDate>
            <description><![CDATA[In this previous post I gave some details about the Optimism RPGF grant Peter Ferguson and I received. We are incredibly grateful for the grant and t...]]></description>
            <content:encoded><![CDATA[<p>In this <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/jamesmccomish.eth/zDG5K5lzZgbG7glPcm7HBW4N-kEB8hkzrLWvGY6afFo">previous post</a> I gave some details about the Optimism RPGF grant <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/peterferguson.eth">Peter Ferguson</a> and I received. We are incredibly grateful for the grant and to the wider Optimism community for the votes! This piece takes a look at some of the criticism the program received related to some larger, VC backed applicants.</p><div class="relative header-and-anchor"><h2 id="h-criticism">Criticism</h2></div><p>A lot of negative feedback has been thrown towards well funded companies applying for the RPGF grants (sorry Alchemy, you’re the scapegoat here). It stems from the belief that a $500 million funded company should not be taking resources from smaller teams — the push back being that, to quote the motto of the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://community.optimism.io/docs/governance/citizens-house/">Optimism RPGF itself</a>, ‘impact = profit’ and since the companies provide impact, it is fair that they get a share of profits.</p><div class="relative header-and-anchor"><h2 id="h-why-contribute"><strong>Why Contribute</strong></h2></div><p>I don’t know what it is like to run a company with $500 million in funding, but I imagine the decision to start a project is probably similar to what we, as 2 people with no funding, thought:</p><ul><li><p>Is this thing worth building</p></li><li><p>Do we have capacity to build it</p></li><li><p>What do we get in return</p></li></ul><p>Our answers were</p><ul><li><p>Yes</p></li><li><p>Yes, if we drop everything else we’re working on</p></li><li><p>A brand new tool which is a huge unlock for users. And by open sourcing, social capital for our small team, earned by contributing something brand new to the community (We genuinely hadn’t even considered the grant, and it just kinda landed in our inbox from Binji months after)</p></li></ul><p>The answers for a $500 million funded company are probably</p><ul><li><p>Yes</p></li><li><p>Yes,</p></li><li><p>And the third is where the criticism stems…</p></li></ul><p>Like us, larger companies also get a product for their users. If they decide to gate access or charge for it, then it is not a public good, if they provide it free or open source, and it benefits the ecosystem then by definition it is, so what is the fuss about?</p><div class="relative header-and-anchor"><h2 id="h-potential-for-conflict"><strong>Potential for Conflict</strong></h2></div><p>I believe it comes from some contradictions between the public good itself, and the opportunity cost of other smaller projects losing out. A look at the docs from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://community.optimism.io/docs/governance/citizens-house/">Optimism’s RPGF</a> page makes a few statements.</p><p><strong><em>‘…provided positive impact to the Optimism Collective…’</em></strong></p><ul><li><p>Did these companies provide positive impact? Of course.</p></li><li><p>Is giving them an inconsequential amount of money relative to their funding the best way to create more positively impact the collective? Probably not.</p></li><li><p>Small unfunded teams could receive the same amount and go full time with a year of runway, overall creating a much more significant, and decentralised, impact in the long run. We had to drop all our engineering work to build the work we were awarded for. Supporting more teams to make those leaps can create new companies rather than profit existing ones.</p></li></ul><p><strong><em>‘… create strong incentive for people to build…’</em></strong></p><ul><li><p>It is unlikely that Alchemy or other well funded companies considered the one off return of ~$300k as a dealbreaker in terms of wether the feature was built. So on this point they are not the target profile for these grants and should probably not apply.</p></li><li><p>While great PR from contributing to the open source ecosystem is an incentive, it certainly does not require collecting a payout</p></li></ul><p><strong><em>‘RetroPGF also provides possible exit liquidity for public goods projects’</em></strong></p><ul><li><p>This is probably the most out of touch with the larger companies.</p></li></ul><p>When a company like Alchemy open sources some work, they can provide incredible tooling for devs to work with, that can contribute to standardisation around their stack, mutually benefiting the company and community. Since they get good PR (similar to our incentive for early social capital) and since it is perfectly within the rules that VC backed companies can apply, it is understandable why they do so.</p><p>But there could be some changes made to make sure future rounds do not have such controversy about the grants that end up getting awarded.</p><div class="relative header-and-anchor"><h2 id="h-improvements"><strong>Improvements</strong></h2></div><p>Unsurprisingly, some of the most involved members of the community have already given this thought and are actively working on improvements.</p><p>By creating more focused rounds, Optimism could set conditions for projects that have not taken VC funding, or have revenues below a certain amount. Setting specific themes like ‘educational content’ can also ensure allocations are going to make it to valuable projects which may not have received enough votes when up against too many other categories.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0a051f85029a3329fbf2713867b24a8a.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAATCAIAAAB+9pigAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFXUlEQVR4nK1Vb2gTZxgPw83BxqBC223UjmZtlmR3xy7uruTPe+Gu9GIvcgnJJZfSi15CkpKKpmSRVWZ0baF+UKaDIrbSZpp9cEjcep0NJZc1jBlHwiQV42AOm2HxQ0GzL+5DZM1II1X8sMG236fnfT48v+d9n9/veRUbDx8qFIqjo6OFQmF6djZmdwWFsPRjqV7frNWe1P8DqtVqrVZTbMPucm3Hn361uLlZe/z4j9oW6vX6dtCMt6s8n3/+WKvV7tz5uVr9XRE/caJZ9PYvv54Ynzw9fe63Bw/q9fqfm5v1/wOKjY2N4hYkSUqn0/n89UQisSBJqdRVWZbT6eVrS0sruZwkLaZSqXw+f/nyZUmSbpZKsixL0mImk0mn05IkXUmlSqVSPp9Pp5e3MovZbLZBcCmZNJtJAAiCMKs177M2OwQjH2IYiup0uj0QjFBUXyAYHGAYEwBDgqDWaFtadrl5Tz9NYxhOUhRJUSYAjCbA2uwYhjeSJKnWaN28p0EwNz/P2uwGg7FjdydJUQ4nh6I6CEZUKlUsdsTN8wAQFNUHwQiCIBzngmCEYaw7d77a2tY+wDCtbe0QjDicHAQj0Wh0Y2PjxSf64fp1h5NjbXabzW6x7O3uUTmc3MjIQat1n5v3TExMcpxrgGHCIyM+nz8cDmMY7vEMHhBFtUZLkmQgGIrH46zNrjcYWZt9YmJyZOQgAMTq6q3mqBXpdLq7RwUAodfrWZudtdkFwSsIXgzDGcYaCIaiH8Vo2hIIhrze/W7eozcYIRghKUqhUHT3qEKhYYeTA4DAMLxLqWxSduzuvFkqPSWQZdkEAE1baNri8Qw2Wzh0+DBJUQMMQ9OWSGQ0EAyKoh9BkEAwFAoNDzBMP00ThDkQDMZiRwwGo9e73+fzW637MAxv8hWLxacEyWRSrdEShFmpfFet0TKMlSDMWgju7lGRJKmFIJZlu5TK1rZ2jUaLojq9wWix7H1pxyuC4KVpS2tbO4rqaNqyNR4Yw3AAiJVcbtsuilTqKse5MAx3855IZNRq3edwOiORCATDrM0eCIY+OXZsSBA6dneGQsPj4+MfoKgoNpolCDPDWD2eQYIwQzDi5j2HDkdwvDcUGoZgRK3RdveoKpWK4puFBYrqGxIEvcHIMFaSJB1OzmAw4njv2NhRFNW1trXrDUaatgBAsCwLCLKt/c1m14LgdfM8BCM0bcEwPBIZZRirCYC5+fmmqx49eqTIZrMc5/b5/CRF2Wz2A6IIAGGx7OU4Vzx+3GazkxQlig39eDyD3T09BoNxgGHcPB8KDQeCITfPDzCMw8k5nJyb54cEIRwOV6vVZzJNJpM63R61RtvZ+Q6CIFdSKb1e3xAuy6KozrblO5KivN79CILswbAdL+/s6+tvDgCCkS6lEoIREwAHRNHjGXxPrb23tvb8UlJUKhVR9HOci+NcTU/heC9JkgaDMRY7Iop+UfRjGG617mtINhoFgPD5/GqNtil8o9HUT9Nqjbafpmna4nA69Qbja6+/YQKgUqk0CFZyuS6lEsNwjnNRVB+K6jAMb3b31tsdKKpjGCsAREvLLhzv5ThXl1IZjUbL5fKNGzeKxZ9WV28Vi8VsNlsulwuFwu1y+e7du7Isl8vlZzeYmjo5Ozs7PT19fmbm7NnPz8/MJBKJU6dOx+PxqamTn505c/HSxY/HxiYmJq+kUvH4cUlafGFp/902vbe2tpyRv7j05XJGLhSL0rWlQrF4YS6Ry32fSqVcbveCJGXklfvr6/9yXd9fX1+Qvr0wl/huZeXrBUm6tpSRV86dn1nOyMlkUhC8S0vpC3OJwlNnPnnhh/lHgr8ARVjQGFi/YRgAAAAASUVORK5CYII=" nextheight="704" nextwidth="1184" class="image-node embed"></figure><p>Thought is also being given to allowing VC backed companies in, but weighting their potential reward based on how much funding they have taken.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/cd01ca41cb1d65cb6b00d5094499c121.png" alt="https://gov.optimism.io/t/lefteris-rpgf-3-voting-rationale-learnings-and-feedback/7213" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAFCAIAAACreXkmAAAACXBIWXMAABYlAAAWJQFJUiTwAAABLUlEQVR4nGWRoY7DMAyG8wolBQUhkUxKDEIKQkxKBkKGBoYKikZGRkL2KuMjQ0MhQUElRUNBQSFBQXdSo1U63Qes+Ldl/3JYzjmEEL+klGKMIYSUUtXD3+reUPU93ePeE2MspbDn8ymEkFLChhCCiNq2VUoxxgCAc973vRBCKQUAjLFhGBCxVpVSUsq2bQGg2dBad13XNM0wDN579n6/EXEcx3mep2kyxnDOlVLX6xURtdbn8xkAjDHOOQAgovv9rrXmnN9ut9PpNI7j8XgkIq01AFwuF+99zrlssMfj0W9M0ySlrE4RcZ7n6hQRjTGv1+twOCAiEXVdR0R1cTWRc97PlVIqpfx8YZ/Px1rrvbcbzjnvfY3LslS9fonfcM5Za5dlWde1vp1z+7j//AKnWg9FO/VwNwAAAABJRU5ErkJggg==" nextheight="254" nextwidth="1742" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We look forward to seeing how the grants progress, and again are grateful to the community for the award this year! In 2024 we will continue to develop our app, attempt to positively impact the wider Optimism ecosystem, and hopefully build something worth applying with again, however the rules look then!</p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/68e46f3461cd64f8b0b109d4ec0b65a7.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Optimism RPGF: Passkey Wallet]]></title>
            <link>https://paragraph.com/@jamesmccomish/optimism-rpgf-passkey-wallet</link>
            <guid>1novx3IgtJhKpdQul0XV</guid>
            <pubDate>Fri, 12 Jan 2024 20:24:18 GMT</pubDate>
            <description><![CDATA[Incredibly grateful for the grant we received from Optimism for our work on Forum last year! A short description of what we were awarded for, and gen...]]></description>
            <content:encoded><![CDATA[<p>Incredibly grateful for the grant we received from Optimism for our work on Forum last year! A short description of what we were awarded for, and general thoughts on the process.</p><div class="relative header-and-anchor"><h2 id="h-passkey-wallet">Passkey Wallet</h2></div><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/peterferguson.eth">Peter Ferguson</a> and I first dove into the world of Account Abstraction via the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.erc4337.io/#join">ERC-4337 community</a> on Telegram in mid 2022 when we were looking for the most convenient way to onboard new users into investment DAOs.</p><p>We realised that ERC-4337 would let us implement our own logic for what a valid signature to initiate a transaction would be. This meant that we could replace EOAs to let users get onchain with more familiar login flows and less chance of losing/phishing a seed phrase, with the added benefit of not having to compromise on decentralisation as the verification could be done onchain. The question remained as to what exactly would create the signatures.</p><p>After a short exploration into using MPC, we seen that <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://passkeys.is/">passkeys</a> were gaining traction as a replacement for passwords. Passkeys had been tentatively rolled out in iOS 15, and the iOS 16 launch gave them much more importance. Users could now create a public / private key pair which would be securely encrypted and stored in iCloud keychain, giving them the ability to sign in to apps by using Face ID.</p><p>The great thing about passkeys was that the elliptic curve used secp256r1 (as opposed to Ethereums native secp256k1) had already been implemented in Solidity - and soon after, teams like Ledger started working on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/rdubois-crypto/FreshCryptoLib">optimised versions</a> which would make it even more efficient.</p><p>Armed with the above we put together an iOS app which allowed users to create a passkey wallet and get onchain using only FaceID! We had not received any funding, had not released our alpha, and were in the process of getting our first testers. We decided to open source <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/forumdaos/forum-contracts">our work</a> to deepen our involvement in the AA community, remained active in the ERC-4337 telegram, and gave a number of talks and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://player.fm/series/web3-galaxy-brain/forum-with-james-mccomish-and-peter-ferguson">podcasts</a> to share what we had learnt.</p><div class="relative header-and-anchor"><h2 id="h-farcaster">Farcaster</h2></div><p>Although less directly relevant to the grant, we also produced work on Farcaster after we both got hooked on the developer community and ease of building cool integrations. We were one of the first mobile clients which allowed you to connect with other users, and even make passkey transactions to send them funds.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/forumdaos/status/1653755763976749056?s=20">https://x.com/forumdaos/status/1653755763976749056?s=20</a></p><div class="relative header-and-anchor"><h2 id="h-application">Application</h2></div><p>Binji reached out to us late last year and encouraged us to apply so we thought it might be worth a go. At the time both Peter and I were worryingly low on money, and had taken on some freelance work to let us continue to bootstrap Forum. Getting a payout for that early work is a huge boost and really opens up a lot of opportunity for us from here - so thanks Binji and Optimism!</p><p>In 2024 we will continue to develop the app, push for the wider adoption of passkeys, and attempt to positively impact the wider Optimism/Ethereum ecosystem.</p><p>🔴🔴🔴</p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/c3930e564a2d70ff3bad4c4b62869c61.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Improvement is an Understatement]]></title>
            <link>https://paragraph.com/@jamesmccomish/improvement-is-an-understatement</link>
            <guid>hEvUI7yk9TBoAPGhkcSY</guid>
            <pubDate>Mon, 16 Oct 2023 14:54:31 GMT</pubDate>
            <description><![CDATA[On a technical level the validators of Ethereum work to reach consensus on the correct state of the network, and although not a simple task, there is at least a well defined set of operations to run, check, and agree upon. But move up a few layers, beyond the world of bits, and you find a much messier, more human, level of consensus that needs to be settled. The world of Ethereum Improvement Proposals (EIPs) is the arena in which any changes to the blockchain must prove themselves not mathema...]]></description>
            <content:encoded><![CDATA[<p>On a technical level the validators of Ethereum work to reach consensus on the correct state of the network, and although not a simple task, there is at least a well defined set of operations to run, check, and agree upon. But move up a few layers, beyond the world of bits, and you find a much messier, more human, level of consensus that needs to be settled. The world of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/all">Ethereum Improvement Proposals</a> (EIPs) is the arena in which any changes to the blockchain must prove themselves not mathematically, but socially.</p><p>Among the EIPs — which map roughly to the Internet Protocol Standards that define the internet — there are proposals that cover low level decisions effecting the execution of code on the EVM, standards for sending data between dApps, and suggested APIs for implementing interactions between end users.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/02138365eaedeb979336ae888b99aa98.png" blurdataurl="data:image/png;base64,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" nextheight="1124" nextwidth="1924" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Table of EIP types with examples</figcaption></figure><div class="relative header-and-anchor"><h2 id="h-the-ethereum-request-for-comment-erc">The Ethereum Request for Comment (ERC)</h2></div><p>Core EIPs tend to be more involved, and can require the network to change the lowest levels. Decisions here tend to be hard fought as enshirning more functionality directly into into the system comes with some tradeoffs (see this <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vitalik.ca/general/2023/09/30/enshrinement.html">popular travel blog</a> for details)</p><p>The less strictly enforced ERCs sit at the opposite end of the spectrum. As they don’t technically require any approval, an ERC can be used by anyone as soon as it is public. While Core proposals focus on technicalities of blockchain infrastructure, ERCs are an attempt to codify an idea into a composable interface; an API to interact with the blockchain state.</p><p>ERCs define the functions which end users experience when interacting with the blockchain day to day, and a select few have gone beyond mere technical documentation, or utilities in apps. From here we will look at the ERCs which captured the most fundamental use cases to not only establish themselves as standards, but to spawn fully fledged industries.</p><div class="relative header-and-anchor"><h2 id="h-erc-20-token-standard">ERC-20: Token Standard</h2></div><p>‘Tokenizing’ things like voting power in a group, or rewards for playing a game can be useful to standardize comparisons between participants. The issue is that the use cases for a token to represent voting share, and a token to count how much of an in game asset you can spend are very different.</p><p>In the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-20">ERC-20</a> spec, essential things like total supply, balance of a user, and how transfers should be carried out are defined in their simplest terms. This lets any smart contract developer inherit the standard, then customise the base functions to their needs. So although the voting power in your group may not be transferable, the in game asset will be. This gives app developers something to work with, since they can build sets of functions that make predictable calls to the base functions, regardless of what internal logic the specific token has decided to add. The biggest example of an app capatilizing on this composability is <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.uniswap.org/">Uniswap</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6e48ac7dd696caa749a0d91fbf278d53.png" alt="Basic ERC-20 interface, and some tokens listed on Uniswap" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAbCAIAAACSpRrNAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGSUlEQVR4nJ1UbW/byBGmz45eI0qilrvL5YuoXVE0KYp6p2RKsuTIduSDXUMnSFai1HbSXtG7w30oUKBAP/R3Hprg0N4PuH5o4gIBeigoOrKQoAfcDQbE7iy58zzPzJAr5bXVsH7mlYcth3Unhn9eGV3S5hFrn7DOJF9QMwJK8CiWAskUiP1y5xI8TGagYDRwrS80jv2yeTOqV4t5jVmVhl+rt/uDo32rmsygz2LgUSIXeiSZ240H22gKxJNCPClE49no49z/ScCLEGIEMRYxAJIkkZyIZSLLkpzKKSmoJQUiZLGKsSRCQUAASHwGSoggKPFpmMgQHmkZTNMCSX5ClIvzMJWGZ155cVi7HTcH9f0/zg9fXBx8ezXyO748nOuDc4HWWo47P+2PDrrVIvv6aePcs0/qpd8duYd20bA7sHWSH04JrXER/rMYiCSFSDQdSQqbBOJpy571KqthvWbQi6PmctJ5MfG6ntc8fEL9M8npQKvDU5cezYjVPek0Bs2KzPZ7/b7XaJ7VzIHnFSutqu1YhTxTVQGqWVoRkJ7cJJi07EW/9vJJs20Z1xcHi1NvdtztHg6Ggx7rnolmU/VOkFHL++duu+d5HjVsVvV6x5N6vTN090+PjyzLdWjBKxUqeYKgAl0fqXYqLd5LdN51fnvU/P1x67Bp/fnm+Pri4NXlsHpwoozm+d7ngrpP3H5pstS6Z3W7/uWT+jeTTsdk14fu80GlaZr94ZNWs63n7bhk8EYTWx2eh9F49r7IsRQgWNJlZb+gyxjrmmIV9abNmKxkVCurWymsJ7I4o1lZtZTI5Skh1WIeQyRBpMsylUk9T0oEYaRm1P0cdURWzQrkoYsSPCzl802DAlLI6FVQ6qQkM606GbOdVswc0ku0VTZ7GOq8XMRON6lYPCwy1i4ZPkDFGCykWENwejlSjEb5oLxRPqxwkIDP4IwgLUeNryae2+hY4yt7PC+1T8v935iTRd6fMNt/Olxenv3BdfqkNbImz/Ld01LZPxlcfXH2pev0kNU2ji7tz5+Xyn4qLfIZtO1cPBHjdqKxSDIejXOP+J2EyEWyXCTDPUpzkTS3x3M7j3f30pEo4HaS3F6K23sIPooCbvcxt5MIIns8x8U4bvdjXyyvZ/MXF1+szqer6Ww1m7+Yzp5dTq+m8+fT2bPF4ma5ejlf3syXN1fPbxfLmw9+GwYXy9u1B8Gr1cvl6tVHzr27+89d4Hfv379/d3f344//+vfbt//96ae3b+/e3d3984cfvvvu769fv3n95k3wDBfb69c/599//w+u2+3M5/PxeHx9fX15ednv9weDwWw2m8/nt7e3GGOO43Z/le3s7CSTSQ5jIkkyhBCsbbMIDSGEf60hhHRd5yr1w4vpzdOnx4ZhEEJc11UUhVJqGAZjjBCCEAqzwrVtcIQmCMI2LEEQNkcAAEVROAghxlinlNJCeBeEcHuBEFIURdO0MEIIoYxtXmCMUUoFQQhhmaYZfgYRuk8QaiBhqCjKNrRtIAAAjHG4xQgX9Aco2toAAIQQTdMopRBCEYgiEO8TAJDTmXU++9a2TcbYp7drmuZ5nmmaQAw+w6qsGPkA41ofy7IMwwjFMU2zXq8HIGQJy4ToAW8OQkCI0miOGGOfkgBraI7jbKBhWZKoBtcEAAChRCFLSqllWRBCiWBZlUWMCCGcCHK6sT+avmrU3bLjWJa1UWNTRkqpbdsBZ1GkhNQ1Da8l1jTN933G2CZBq9UKdJMwI7iIJDUsskTkktNklOq6rijKRt/tZtA2RUZIJQRBCEQRIWQYxoY3ISQUGRMpUFKVNU3hRACYZU6+WnXaXrfbtW37I6EAAIZhuK4bEACipKt5t4gwygk5Sul4PLYsa8PA8zyIENZkTLCI4Ic2JUQv2QgFkoUD8lGp8doe9ltNvBmU8DVCSIgJYYRkrKgBgxw1ypPpnw66nX6/7/u+ZVmEkA0J4UN7rBkAUlCpW0IYies5H41GjuOE48YY830/yKTKpKDCkAEQRU1TDroehMFeUZQQxXYBdF1/YIACiTcMNE3bHGmapihK2KYBSwkrqsoJQq5Wrfztr3/p9wfj8dhxnPtp/ADftu3xeBzUIBgecc3AQPi+i8bjsW3b4R/C8zzf94EIyJqBFHSM8j/5+Jd7Nt2sYwAAAABJRU5ErkJggg==" nextheight="2318" nextwidth="2703" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Basic ERC-20 interface, and some tokens listed on Uniswap</figcaption></figure><p>Uniswap has built a $3 billion business around facilitating swaps of tokens between users in a permissionless way. Multiple exchanges and trading platforms have popped up to support other actions made possible by tokens like lending, borrowing, or staking. Combining all ERC-20 tokens on the market gives ~$300b in value… not bad for a few lines of code written in 2015.</p><div class="relative header-and-anchor"><h2 id="h-erc-721-non-fungible-token-standard">ERC-721: Non-Fungible Token Standard</h2></div><p>Perhaps the most extreme example of an ERC producing unpredictable upside is the, at times notorious, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-721">ERC-721</a>. Here the concept of non-fungibility was incorporated into an interface similar to ERC-20, allowing each token to represent a unique item, and in many cases, an associated image or metadata.</p><p>One major difference between the fallout of this token and ERC-20 is that as well as marketplaces doing billions in trading volume, these tokens have generated everything from ticket platforms to IP rights for movies. The subtle difference of assigning each token associated data allowed artists to produce works with predefined scarcity, or incentivise ownership by acting as ‘token gating’ to online communities.</p><p>Some of the more inventive use cases include minting an onchain SVG to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.watchfaces.world/#10-4-9-0">redeem a matching watch</a>, or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.fiveoutofnine.com/">playing chess against an onchain engine</a> and minting the result. And with standards like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-6551">ERC-6551</a> giving NFTs the ability to control assets, the next wave could be exciting for a lot more than just price speculation.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7823e0f2e6486c3e048f608a236cfc3a.png" alt="Two innovative uses for ERC-721 (Watchfaces World &amp; Fiveoutofnine Onchain Chess)" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAMCAIAAACMdijuAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmElEQVR4nH2UT2zbVBzHf/aLYydaHfLXz+8923HsJE5Llza0aarMTtWqVbMWiTWMrKNS0XYZo9skLpwQGwfIBIgDqBc0DkiAtAMgxLilEj1NTEgrBzhUo8AGGpoQnaaNPwWCnIxSgcTn8A5Pev685/f9PkAImWlmGTrDjGLdMHJEs+yBwZiicBzH8zwA9MZCoeC6bjQaJYSoqqooCsaY/C+KoviL4/E4TqUIVpVEMpFIpFJKPB5HgQD8zV4BpbQ0NFRwnFrNGx0ZYdSHddH+g6qq/uKILEtyH4r0BeV9+2Q5IsuhUEiSpHq9Pjk5KYqiIAi7ApVq5UrVsHP5gUFnYNDK5hzHyeX8Udc0QsiujzHmC7juHikIUyANQvdLnD8ny/Kp06eXl5f7ugCA4ziu56XVZDGrDVtkv0X326yQ0XXDx7Zty7bTpo+u65qm6bruC4CDE0H1Zv3Mrdff23zprVZpNsUHgeMEjpMQAs5HFCUA6C/kR6u1dyfgx8fhSjP8+WHYXoS3Z4JJolNCxiuVadc9WK83Go1yuYwxvv+LxoOBe0snb1+7881mZ+v7zndXv326MA4AkiQpyZQoSjyPJCm0K1ibgZvHxLUj6fUm+fp4sj0HCtEJIdVKZb5ae2Th8KP/EpyLK79f/GCj/dWH5zbfeOHqpcvXLp09HwPgJCkajSIU2CsoV2sfTcONRWg3tXeWK18sRT+egxTVCKXu6NCpxkr1iecXHp4dq1QwxnpPcFZO/PnJ5V/udq5/9sPWp9d/+6PTfuW1JAAEgxFZ9oOKUCi05wSzsH0UNpqBjQbabkJ7HlIqVVKpuYP1o0vHpucfW3nq5NTUVCKZpL1LrgHcOPPczr3O3VudnZ87v/608+yBSQSABCEWi4XD4YAghMLh3iV7nnei9MDaodCdRbh9BNYW+lbctJXv1zQ9k8mUSsOloWKxWMw7Ts4whq0sUQlwPHccIuuLz2y9f+XLi+vnZw8xrpt8jkcogFCA4/leTB3HqXneg7qyMo5fnYi87MpPjuGRvOXk85ZlUUpVn/sVy9l2v+MQSrs94jgbAi4vlVBQ5nlACAAY01ZXV1ut1out1oULbxqGYabTB2oToxjNpCXdiDxUEr0xYWxQxFillGraP0WzLCubzZqZTDemva6KohAOC+Ew390sAAiCwBgzTTPdzTUA5PN51/VoXC6whMmSWTOWNRMZPdHtMt37QjDGelXAGP8F7g/W58ci8GMAAAAASUVORK5CYII=" nextheight="1241" nextwidth="3252" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Two innovative uses for ERC-721 (Watchfaces World &amp; Fiveoutofnine Onchain Chess)</figcaption></figure><div class="relative header-and-anchor"><h2 id="h-erc-2981-nft-royalty-standard">ERC-2981: NFT Royalty Standard</h2></div><p>Until now the ERCs have mostly been examples of how a widely accepted idea can generate an industry, but the next highlights the risk of having application standards rather than protocol level enforcement. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-2981">ERC-2981</a> was not the first (or last) attempt to put NFT royalties onchain, and the debate around the philosophy of recurring revenue heated up in 2022. Whether artists could survive long term without an ongoing revenue stream, or if it was excessive to expect income from a single artwork for all time divided artists and marketplaces alike.</p><p>Royalty payments were generally determined by the marketplace, with Opensea making a push for the NFT industry to empower creators to be able to enforce royalties on their collections across all marketplaces. Their rival, Blur, managed to hijack volume through clever incentives for both creators and buyers, including disencentivizing cross selling assets on multiple marketplaces.</p><p>In the end ERC-2981 could never ‘solve’ onchain royalties; as with many ERCs it was a standard interface, not a compulsory part of the protocol, and to this day there is no strict enforcement of royalties for NFT creators.</p><div class="relative header-and-anchor"><h2 id="h-erc-4337-account-abstraction-using-alt-mempool">ERC-4337: Account Abstraction Using Alt Mempool</h2></div><p>The final industry defining ERC that we will look at is, by some way, the most ambitious. It does not just aim to implement a new token standard, but to emulate the entire transaction and account structure of Ethereum.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-4337">ERC-4337</a> defines an application layer infrastructure in an attempt to replace conventional EOA accounts with smart contract accounts (SCA). From bundler services which send the SCA transactions onchain, to paymasters which can allow dapps to compensate gas spend to drive usage, the industry generated by ERC-4337 is wide reaching.</p><p>Companies such as <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.pimlico.io/">Pimlico</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.candidewallet.com/">Candide</a>, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.stackup.sh/docs">Stackup</a> are building this infrastructure and given the billion dollar valuations of other early providers of ERC tooling like Uniswap, the coming years could be an exciting time for both these companies, and SCAs in general. With complimentary ERCs like ERC-6900 (Modular Accounts) users can have much finer control over the actions their wallet can take, and with ERC-7212 (Precompiled for secp256r1 Curve Support) even increased security by signing with a passkey rather than a seed phrase account.</p><div class="relative header-and-anchor"><h2 id="h-last-call">Last Call</h2></div><p>While all types of EIP are capable of producing major shifts in the ecosystem, the most colourful are the ERCs. This is not to say that Core changes can not produce creative new features. Things like the addition of CREATE2 unlocked lots of fun use cases where smart contracts could be predictably deployed to a set address. But the fact that they require such coordination to happen makes them fell a little less magical.</p><p>The optionality of throwing a novel design pattern out into the world and having it capture the attention of the network and be implemented at scale is something very important for the still relatively early crypto industry. That said, power laws apply to many aspects of life, and protocol standards are certainly one of them. Of the thousands of proposals which have been made, a small fraction are accepted, and even fewer can claim to have single handedly spawned billion dollar industries. So before you go out and create the next big token standard, go check out the wonderful list of all <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/all">EIPs</a> so far to see what you’re up against. Good Luck!</p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <category>eip</category>
            <category>ethereum</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/a207c9221a0e4a641ee932392a8a7197.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Your Name, Onchain]]></title>
            <link>https://paragraph.com/@jamesmccomish/your-name,-onchain</link>
            <guid>APfdjCFlq2qlKYjEhX3m</guid>
            <pubDate>Mon, 16 Oct 2023 10:34:58 GMT</pubDate>
            <description><![CDATA[There have been many blockchain projects where the answer to ‘could it be done’ is yes, and ‘should it be done’, is no… this is another one. There isn’t much point to write your name directly onchain. But there are cases where writing exact bytecode to an address is more than just an exercise in understanding how contracts are deployed at a low level.BackgroundThis article came about while integrating a very cool library from Ledger into our contracts at Forum. The details of the library aren...]]></description>
            <content:encoded><![CDATA[<p>There have been many blockchain projects where the answer to ‘could it be done’ is yes, and ‘should it be done’, is no… this is another one. There isn’t much point to write your name directly onchain. But there are cases where writing exact bytecode to an address is more than just an exercise in understanding how contracts are deployed at a low level.</p><div class="relative header-and-anchor"><h2 id="h-background">Background</h2></div><p>This article came about while integrating a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/rdubois-crypto/FreshCryptoLib/tree/master">very cool library</a> from Ledger into our contracts at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://forumdaos.com">Forum</a>. The details of the library aren’t important here, but basically the trick they used was to ‘precompute’ some commonly used values and store them instead of calculating these values each time. In most cases we would just store the values on a contract and be done.</p><p>The problem is that the precomputed data includes 512 separate 32 byte values, and each run uses about 50 of them. That means it would take over 100,000 gas (50 x 2100 cold access SLOAD) to use this method, defeating the point of precomputing the values in the first place.</p><p>To get around this problem they employed a trick discussed in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xsequence/sstore2/tree/master">SSTORE2</a> library form 0xsequence. Instead of writing the values to storage, they deploy an account where the bytecode is a concatenated version of all the values.</p><div class="relative header-and-anchor"><h2 id="h-account-structure">Account Structure</h2></div><p>To understand where exactly this bytecode is written, it’s worth looking at the structure of an Ethereum account.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6e6224cfebfb0e27f73c5c758f8c0f21.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAASCAIAAAC1qksFAAAACXBIWXMAAAsTAAALEwEAmpwYAAADH0lEQVR4nK1US28TZxS9PwCpCohFJR5SN62y9Q/Igk0XiN0sq+xGxdRyJ7aTSYx0JRaEqnJiO+Nx5uF5Jk7kkgBhAYiFJVpFqpQWCUXqsqskOJAUAs2Dhw/67OCYgBMF8eno6o5055zv3DtziQiyDEkSkOVD0MO74PfJPrQXNzkpIuOWcuufeO9f6TTzU+Z6C6kU2sHxh7r6+2j84aT6SFcfWcqif/XPub7qXN/crHq/CY49bRYnEhgc3EhdBskyKspdMCFzCvTBQePsPV78CjHCpdPoO4YfCBLhfCPKhNS3guESQY606pnRfxlkGEKwxbiygvl5VKtYWNgnR+CzkLsEo0TPr55bK0z9/QCZ+bYb8Elwd7tA3yAol0MkAieEF8JyXmXzy1pxrVD8z3Z2HB+Oh0xGdNx1/10e/J6InABegFKAgrGZ11at0o4bwvdhOsIsuLddIN5fFwLd3fDK8ANYpVcj2aXc2OqYvmbYW64vuMQ8e6rMaAqEDTovQEFfH8kuW6VtfwJBADPsINDeomaXajUsLX3QfSISLw90NfNyWWhMTmOqIqIb1jWtJmpSJ/a1SAgwLzILLub9pJKESmVvPE0BL8BvMwLhZL08hfIUZm4gnIAdiEpkFMNYWOTKQQ5a5yMH3xBRpQLPg+vDtLdNe8u0Nyen4Vk7XAUSJL6lHsIFkcRinxLodPBewPdhO6/HzRcN9i3T2tLHn5W8+rCOmkT3B675Lnx7o6ODjgLYnUEwAcPezOYfj+aWs/mVvLaaza+YzpuR4mt8TVd+/OOXPK6NCsJc7sgOupr5vXuYncXMTUxfx+07uH4bzCxqoichdScuPk9FnxBR7+c58Hzxx+jFDa24bjk7eW3VdLa9AJoJnKWZxK9Qz0D9DjGS+LMcuCGCCejmi7HC+rj1f0574rhvbQdX9O2aRKPxajSJaFIQfjxkHAgWq6LRio6XUGiOqz8l0T8kCBXlKA6ISGy6RCPycRFbCR8XiAoByBElA8NY2NtFzEinxT44FKp6CJgxPIyBASiKSHa3KbPY3bEkfla/DJLp3URRMTT08h3CtyqFNxk0gQAAAABJRU5ErkJggg==" nextheight="607" nextwidth="1080" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Fields of an account on Ethereum (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum.org/en/developers/docs/accounts">https://ethereum.org/en/developers/docs/accounts</a>)</figcaption></figure><p>From this diagram you can see that the storage (all variables defined in the contract) and the code (EVM opcodes which execute when called) are stored in different places. The storage of an account can be updated, but the code is immutable… the perfect place to write your name!</p><div class="relative header-and-anchor"><h2 id="h-smart-contract">Smart Contract</h2></div><p>The next step is working out how to set the code field of an account. The best way to generate the bytecode needed to deploy an account, is to use some high level language like Solidity and write something like:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/380ffc21af96e7abf9b18cb1abfe1236.png" alt="A solidity contract and the corresponding initcode generated when compiled" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAALCAIAAACRcxhWAAAACXBIWXMAAAsTAAALEwEAmpwYAAADB0lEQVR4nI1TbU8TWRS+v2MzrInZXyAbU/zoj5HO0GkLlK6uQNtpO2M7pIBB3S8bf4OuiATBakFpMVS6iruCoBCgtNMp03npfZnO3dxB4xeT9cnJyTnPOTknOS8A/DDoswQAYOfOjaM/k2+mR7dmxqrTsep0bLMwWpuN12bjWzNjtZl4tRDbmhlj0cLoh7vXASTfAAklhBJKIaGUnhuEEqYJpS5ClNJXsljOR58kg4vJ4JLELyQGF1O+neIXk8EViV9KBRmZZLqiDgPiUQv3TEQwcQlxsQ9CXAgRQtglLkS41/O6XUgp7VFaUyPbczfWlPCaEl5VxJe3wmuK+MWVxVWZMasyY1YVsVoYBU7z0Plcc/Y223pzXzc/652PmlE3rH29cdBu7ekN3eg4XWjZjkcppLSsCG/nfivJQ8VMqJgWViSe6bTA3ExoRfLttPBCEZcl/vXUCEAdDetHpLlnOY5mkzMH6TayutCA9hm0dceECBGMEcJsan6D2mz8eSb0Iiuel/ar+w2yrOuyxBczoZIcWpGGqoUYQJaBzk5xR+u1TyzbOTFIwyINk0nLcluWp1le0ySaxRaAKX2jittz10uyWFajbCZKuCSLJTm0duvLxNjQcixUzA5tTscAbh+R+r/Wya55vHPU6tROu7XD9oe6ud+yd1ra++bJvn76STfrBiYea1BRhMrUyNO0sJAYXErySxLbLRO2auYup3jG+zvfUEeAYZMupnUbH1vuoQH1Tufw4EBrNlzH7FjH9bNNzfjHcWzknxCl9K0a2b33eyUfKecj67nIei5cyUcr+Wg5H92YGl7PRTbU6Oup4TJLiL67HQcOom6P/i88zzs3nieEYjbyaCL4OCHMj/NPJoXHE8L8BP9w/Npf44MLvrswIcxP8g9uBkvKMMAYQ4wh/CYO9MHIr/BzLIdd6k+/zvYFcn1XlL4rKheQLgzkuMsZLpDiBtJcQOIGcowJSNxlmRvIclfv/fgjAwDYJ4OLf4ALKuibBD8r4Jf7oH8bXPr7+9K/Dfp3/wNdF7VOgmTE4gAAAABJRU5ErkJggg==" nextheight="276" nextwidth="837" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">A solidity contract and the corresponding initcode generated when compiled</figcaption></figure><p>When a contract is compiled, the bytecode you see will be a combination of 2 things: The pink ‘initialization code’ and the blue ‘runtime code’. Initialization code (initcode), is executed in the context of the new account and it will setup any state variables, and also return the runtime bytecode. This runtime bytecode, the part we’re interested in, will be written in the code field for the account permanently. (check out <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/coinmonks/evm-part-ii-the-journey-of-smart-contracts-from-solidity-code-to-bytecode-a21300b23dee">here</a> or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.rareskills.io/post/ethereum-contract-creation-code">here</a> for a more in depth walkthrough of this)</p><p>The problem with the contract we’ve written is that is that the bytecode it would write onchain does not include our name. The account would include some storage locations which hold our name, but that’s not good enough. To write your exact name, and no other surrounding faff, you need to manipulate the initcode to return your name, and nothing else.</p><div class="relative header-and-anchor"><h2 id="h-setting-the-bytecode">Setting the Bytecode</h2></div><p>This is where the SSTORE2 library comes in handy, as it has a function which sets the initcode needed to deploy some specific bytecode. By making the initcode a set of instructions which return exactly what we need.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ccfbea8a3e9c0781951cf9f9b56a2c0b.png" alt="Edited version of the SSTORE2 initcode generator" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAANCAIAAABHKvtLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC1ElEQVR4nJ2UT0gbQRjFlx6EniwtbUGIrag9elOxbZJSaxIVSUwRo20PjUXaxogW/At2s/bgJlBojZtTlhUKLm4vNl0FcbN6qGSUUoyMp+psTpWJJ8MeK1PM0CgkHtp32tlvmN97880MgxD6dXiIMYYQYox/7u8bRsY0TVwk9Fd0mM0e0Z+GkSnMMYyMYWSy2SOEkGmahBCGEGKapq5vBAaCcVGa4Xk+HFnTNI6bXpDl6NycIMRkeTE6NzcyOramaYqixEWRZUOquizLixw3zYcjS4mEIMRGRscEITYbjUrSfGAgiBA6D9BN00QIbaZSJC+M8Zqm6foGHW6mUgCANU1bSiS+JL5CCPW8CCE0FrlApwAIodX2ACEkCDG3p5MWtra26+sbJGmeOmhucXyYPbU2Pj6Rt6/ORqN8OEIIYdkQH44AADDGpQEIoed+P8Z4QZb9/j5agBC6PZ2qukwBXd0+RVFKLhEXRT4cYdnQgixns0elEzicLoSQJEm+nl5a2Emn71ltDqeLAlpb2/3+Po6bLgYoisKHIzM8PzI6FhfF0gC3p9MwMnHxDAAAcDhdqqpSgNvTabXZQ9y7YoAgxAQhlu/IBk1csgf2PEDs6vYVemC12Vk2VEjg9njpphcDBoKDF/X5rMk0Qf/LV4UEvp5eek5oAofTtZNOFy9hmiaE8DiXo98lABhjh9P1lmXPzzDzIn9F79HvkxPyj2Ig3DOMzHk7JY2Q/xXz/mPs7qMOp/1hVfnVN8HBquo7DHPJdt+6+W3zx076OJfb3d3b3v4O8jo42EcIAQDo5Uom11dWVxPqipbUk8l1LamnwDbGGACg6zp9e063aCcNu5/1B4ZGm9seW5s72r1PGhqbWpxtUyz3Sf7c9fRFQ2OTxWKprLzl9XpfBwLVNTWTE5PDQ8MOV/vlKzeYsvJr1ytuVtxmysqnWI7jpi0WS21tbV1d3Ww0+gdIQ8R3LWmDbAAAAABJRU5ErkJggg==" nextheight="725" nextwidth="1735" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Edited version of the SSTORE2 initcode generator</figcaption></figure><p>The <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gist.github.com/jamesmccomish/e3be706c8564c4ec685b97f00e3f603b">above code</a> takes our name in bytes and checks the length of it so that we know how many important bytes we need to copy later on. It then adds an offset of 11 (avoiding the 11 bytes of the instructions we’ve written) and copies the nameInBytes variable to memory at position 0. Finally we return the copied bytes, meaning that when this code is ran in the contenxt of a new account, the code field will be exactly the name!</p><div class="relative header-and-anchor"><h2 id="h-testing">Testing</h2></div><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/801c33324db0baa269474e6a11d2f188.png" alt="Foundry test verifing that our contract code is exactly the name" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAOCAIAAADBvonlAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIXRFWHRDcmVhdGlvbgBsdW4gMzEganVsIDIwMjMgMTU6MzY6NTCVJYNXAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAA4RJREFUeJxjWDJvVkyAh6eLXU5WipeLpYO1ob6WgqqiiLuHU7i3Y11xzrYd22/fuXfr9u1bt2/fvnMHziASMVy5fv3U2XO9U2as3LC1q29SemYmBLV3dJ49d+Hly1e379x7/PT546fPnz5//fjp8xcv3z57/pIECy5eunr02PGuvkmFBQU1ZUUtTU1VNbXpmZlZWTn19fUNzW1tbW3tLfUFuemx0WFlZcVpmUml5cUXLl6C6Ef2DVafgXxw4Mixzikzp0+dXJoRP7m/JyYuwT8gKDQsYsH8+fOXrZoyuX/O5JbetsoJHTWT+9paO6snTeveu3cfRP+9ew9u37mHTELEnz1/DrXg9p07+w8dru3sa2yoi/VzbKgoik+Id3Nzi4uNPXfu7LlzZ6/euHXm/KVzFy4fOXpi796DV65cP3Hi9O49+44dP3Hk6NHd+3bu2rt934HdELT/4L4LFy8dOnJ0w8ZNu3fvvXDxEsOFi5cuXLx05tKV3lnzpk1oK0wPz0oKLcmJc3VyTM1MXLxszsIVawurGmxsHW1sbA2NjcvKyn39/H38Alrbe1PTU+NS/IMjXWKT/aISvaMSvafM6p49Z66pqYWVtY2rm9uUKVMYrl6/cejA/pr81Jr81Lkzp92+c+/Z8+ePnzwFe/YezMsg8umzZ3CPwwRBwQIWhCu+hx4HV6/f2L9v7/RJvQKcbHq6ugKCQlraOrm5+RvWrultq8xODqupaW6pzY2Li/DxC7C0tp7QPyUmKnnh4nktlZmJ8WGhYRHGJqaJqZmYRiMs2Lt37+MnTyGp8OqNWxBPPH327OmzZ3fv3rt7F5QJIKqvXr8B13n58pUrV65DQhieqLBYcPvOnU3bdsRm5qelJAU6GuelxWtpa2tp6wgKi7q6uUVHRero6JuaWSopq7q6ueXm5traORw9dpyUjHbl+vadu338AhKTkqdNaMtPDWqsKbSxsXVycbW1c7CxsZ03bz7EvcjaUCMDrwUQD27fuXvylGmLly5fu37T/PmL5s2bv2HjJgiaOGnysuXLZ8+ZO3HS5BUrVi1bvnzZ8uUTJ00m0h8MJ8+c2bZ1c3F2TFF2fHZyWGxwUHJ4RIiHp5amnoqKmoamJje/UEpKemttbXpsXKCzc6h/sLySCgcXr6GxcUBg6LHjJwhYsO/AAaz5Hg3dvYuSSJ4+e3b7zh08cQu3AAAF1I8oszE5twAAAABJRU5ErkJggg==" nextheight="865" nextwidth="1926" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Foundry test verifing that our contract code is exactly the name</figcaption></figure><p>We can now test this out by deploying an account with the initcode as seen above. By using a deployer like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Zoltu/deterministic-deployment-proxy/tree/master">this</a> you can see that the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="">contract</a> is deployed onchain, and the code field is exactly my name (in bytes)!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/66608a8da944e85f1a51502be06957fc.png" alt="" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAOCAIAAADBvonlAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIXRFWHRDcmVhdGlvbgBsdW4gMzEganVsIDIwMjMgMTU6NTI6MDTvHdH8AAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAAuBJREFUeJytVEtPE1EUvokx1Y0JCYmJO1f+ADUBo6L/QDcGjQt2/gAXBE1KE1EeBQUhvIp9TGmFgaGvsWUkJVRrxkBZUECUtrTMDHOnnfYO0GrRIdbMjGkqIWiIX76cnJxz73fu61zAcTCZTAlCmmE5joMISRkxy7AcD4WNZIqHAkISw3LxeIJhuaQa0bIISRwHNxIss8kLgqjN0hQqCXgokCQ56nBYbTan87UoioKQfmW24DjuI0mPxyvLMk3TJpPJ5fFaMfuowxkMBgPT06XSz4Xwqq3fOzr8JgMRyzJWzD5JTMmyXKoAyIhZWZZ3dnfzCgrF4l6xuJfPF1S/mM/nvxa+acFyqqgC5bY/vo/Oh1foUHR1KaGmFAX5TygFSseCLO+X+X3vR0W8EvtgPZa4e78Bw+yzwSCO428piiAIHMdJkhwcGAj4ZyasMz485HLO+vCQrd/rw0MUFZibm8MwjCAIv99PkiRFUTiOj4+PudzuA+sADMs1Gwxm84jR2NHT/cJiMQ8PDz5rfdrVaWxva7VYLNiI83lrn2XI3t9n6e009XQNPWlpaTYY9Hp9s8Hwsre3ra29u7tHr9c3NT3qMBoniSmX2+3yeF1u90YyqRyRmJU4KCaSWxzMafy0noptbG2yAgdFPoPimzyXRgzLZUVBkhCEkGXZWCwWXV4uc35hIRJZjEQWaZoOhz+8C4dpmoYQglRy/cEtcLsW1NeBO3WqvQ4aG07du/nbr1ftvRug7soFoKsGp6t0VWcBOGm22bUTP/qqwJe1pavnQM0ZUFsNaqsUXgTg2nlwCYDLJ1SrU2yNDhzAw8bHpVKp/PAOpfKKEJLWPscnCM8E4bE7xl1uX1pEuZ1CWkRiVsqhvJiVNGc3X0AKlPaRpO1sNsdD4a9U7iC6vEIQ7kliagwnAtQMy0MewsNGw39RPFhAbfoylNWpQodSOE4BISNq30uZxxM6YgdpQcj8X9HKAr8ANNE0xrOOEoMAAAAASUVORK5CYII=" nextheight="730" nextwidth="1638" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p></p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/b8301cebf8c3bba1e2b0f0ee6cfb8104.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Monet was a Punk]]></title>
            <link>https://paragraph.com/@jamesmccomish/monet-was-a-punk</link>
            <guid>34uLW6Jh6rZjlgeF6tza</guid>
            <pubDate>Sun, 04 Jun 2023 22:32:10 GMT</pubDate>
            <description><![CDATA[Would you rather own a Claude Monet painting or a Crypto Punk NFT? While both collections have sold pieces for tens of millions of dollars, they seem worlds apart culturally. Monet fills grand museums and is considered one of the most influential painters of all time; Crypto Punks find themselves as Twitter profile pictures, with critics unable to comprehend why anyone would want to buy a pixelated head. At first glance the only similarity between the two collections is a price tag which few ...]]></description>
            <content:encoded><![CDATA[<p>Would you rather own a Claude Monet painting or a Crypto Punk NFT? While both collections have sold pieces for tens of millions of dollars, they seem worlds apart culturally. Monet fills grand museums and is considered one of the most influential painters of all time; Crypto Punks find themselves as Twitter profile pictures, with critics unable to comprehend why anyone would want to buy a pixelated head. At first glance the only similarity between the two collections is a price tag which few can afford, but if we look back at how each fits into the timeline of modern art, they might be more similar than we think.</p><p>Long before pixelated heads and smiling monkey JPEGs fetched millions at auction, humans used art to express their stories and myths in visual form. From cave paintings to sculptures, these representations evolved as technology improved, and eventually scaled to produce the monolithic sphinx statues in Giza. But they didn’t get much bigger than that. There must have been something about a 73m long, 25m tall, sphinx that made people stop for a second to consider what they were doing with themselves. And thankfully so, because over the next millennia art turned it’s focus away from gods, and back to life on earth.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f6e58157cb7f95d6ddf901a8bbe5e604.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAAAsTAAALEwEAmpwYAAADOElEQVR4nGNIdOTPdVVMd9BoSbZaX2MxKUN7YoJaf6R8Q6hyoL60EjcbAwMDEyMjAwODhCBHZbQGLyczAwMDI1ikY8WjrlVPmxffblt+t3Pl7f619yZteDRx05Mpm+5P33Rv5sb7E9bdZ2gM12lPsFxebnuk06s12DDVVLXHUmaev+y0JKOmUEMzCW64BSL8bAf7LN2MhBgYGJiZQCIrdj5atefJyu13Fm65N2vjvTlbnqxfs/ni+v71e24s3Plo2fa787fcY5iS4bQ+ynqDo9ZiS5Xp+urT1JQmK0pPUpYpslGfEmfsq8wPt0BIgHt5lYG7PhfcgkNH7x49+fDo0Ru7DtzYcvD+mu1X17fHX5hoc2XnwvX776zdf2f17lsMR3oDJtoYTFRXWWOovMFEZ1+42zID5ZXqEnki/HnWci564iALwMZJS/AVh6kZyLLDrTx27M7p0w+OHLl29PjV40fP71u3/Mi8vP/3ln4/O//h4fWH9h8/cPQ6w9PlIVvLvOe5GrWYqZUZ6c5xN1/uqtEnzZejLDkjRtPPQABugZQ4b22smqwIIlY+XDv+8+7RX3d239rSdnZR5qm5cffXF/x/sen/271XV9Xv7Es7MLOU4dIUl501dgdyHI6Wui0rsJ+W4VBgpFjqpLy80nppnk6SjQA8QHSUBXvTNKUEWECRzMDAyMT05UD9930lj9ZlHuwPODkr5tT08DtrMv/fW/X/y9GfFxdeXVV2al4mw8oio9lpesvTDS+3uV/rdzxQZ17koTolWHVphtKcbM0oa4QFVtpC6e7SglxQCxgYGB5vyH27I+/pxpztra7Pt+Sdnx3zZkf5t6OtP0/1fjva/mpH1e0V2QxNbgKTkrXW1rgenxW9usVpRrlDd67XhEi9On+ZslBZJx1QlEICRFORN8BKnJUZxAYLMPz/fvT/58P/X+z8f2vZ/7vL/l1d/v/a4p9np74/2PRqb93LXVXXFicxmHEyx1jLdZQ6Tql0Tg1ULsvybigOTfZVd9bjNJRnFedlghsnzMdhqgpKVIyM0HwAMvrBtv+Ptv9/su3/gy3/H2z6f2f1/9tr/1ye++3kxA+HO94dagcAZ5lif6uvn1QAAAAASUVORK5CYII=" nextheight="542" nextwidth="2000" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Early art depicting livestock or gods</figcaption></figure><p>The shift in focus was pushed by two very different different societies. First Greece emerged and experienced a cultural revolution which called into question basic facts about reality and what it meant to be human, building sculptures in an attempt to perfectly represent the human form. Then it was the Islamic Golden Age which took the lead in developing human thought, and with the cultural shift, art too changed dramatically. Islamic art almost completely avoided the human form, instead it focused on calligraphy and geometric patterns – something which would very soon be utilised in a period of radical change which would accelerate human progress like never before, and open art to the masses for the first time.</p><p>The dramatic transformation, was powered by a new rising class of society. They respected the church but did not prioritise religion, they openly desired increased political power but did not threaten the ruling class, their movements and worldview moved, quite literally, wherever the wind would take them. The merchant class, centered mostly in Florence were beginning to compete with the church and royals to commission works of art, and the newfound desire to integrate science into all aspects of society caused an explosive transformation of city life in Italy.</p><p>While many incredible contributions aligned over the course of the Renaissance, the output of one Florentine architect stood above the rest. It was <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.britannica.com/biography/Filippo-Brunelleschi">Filippo Brunelleschi</a> who, around the year 1410, applied mathematical principles first developed by Euclid, then refined by Islamic polymath <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.britannica.com/biography/Ibn-al-Haytham">Ibn al Haytham</a>, to a sketch which unlocked potentially the most significant concept in the history of art – linear perspective. His sketch of the Florentine baptistery used converging lines to predict how the building would project backwards into space. It’s easy to take such a widely used technique today for granted, but it was a revolution that made post-1410 art look otherworldly compared to anything that came before. Pre-Renaissance art could depict objects using oblique perspective, but never extended this to give true depth to paintings . Brunelleschi correctly converged the lines to a single vanishing point.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/47b0269435b1f57c3277759e32775343.png" alt="Pre linear perspective art used oblique projection to show 3D objects, but could not correctly converge the lines to a single vanishing point to show realistic depth." title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAICAIAAAAX52r4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAC/klEQVR4nD2Sa0hTARzF//nAR8s0q7lsNtN5mY+5fOR8v5Zzbldrc5q6yhJDM0mb+QybG4ZUYpFGRmUUpURgRExFhVWMQFN8xC6VXAnuwA0WlAii5j/K8Hw4H86XH4dzoDTVPUcAUj7EcSA9zFN/0qdDAvek0HcKfjDfEHFjYwMRV1dXbTYbTdN2u339XwLeZKTiZmF5T37Z/RTNE7my/q4GajPZ1Vf66nQvFae7xMpbRPxZiD8EKjHkiT39XSCCC4YCnzeVMNTA1sr2W7/Or61vOByOpaUlhmGMRuPo6ChFUSsrK4gYQsSLYxNVZPGDRx+e9g13tlS3lMukcYGt2vqRoZmHvYOFJBkbEQrBPhDOgWsaQf2Jgx1lka2KPV0ktJ/w3wfwyWz+vblJ0zTDMBRF6XS67u7uyclJh8OBiEfChVFCIp8kx0Y+Dg30v+ztLJBn8gO8DfVVb18NKBXJBTlHxZE8SCOcCn3gKnm4Ws3Vn4mpSWLLRB6S8J2FAJRpDBEXFxdNJhNFUf39/dPT01uOiMLDwWpSqZDIO9u7Xw+MjQwaO5q0xXJxW4O2rrK8hMy8rdPWlBeDNNRF5QHVwl1dtWKDKrjqqF8oB9LCoFYEX6bMiLi8vDw1NUVR1NzcnNlsNhqNNE0jYlIQt6Ek55w8rbk090VX22PDZXrC/KxT33Ja1qw51lAia68oUGYkQqLAiQ3Q6ArvenKfNSZrRL6EG+grU9uyXD+/H0fE9bU1m802MTExPDw8Pj6+sLBAUdTfkcFPGp0sYLuHHYCyBK+UCNEdXVPzhaqYUH56yO7KEHexL/xVU1EQ3xPyWVAas6M578CddE4AQFr43nY1b8Zs2n7RVg+LxWK1WhnGiohuXkLgkFzWvkh/5+tqXoKkTk2qdBUaUZQggc+65Af/AVlhkBEMUa4gAoh1hvM8iOZABIDkCJf5btkGIOLs7Oz8/Lzdbv/58xciunBSnbyjuazd2QRoc4KOq2pv6Due18VdzACCtzObBUUxgdEE8QdPdGVUEJP4VgAAAABJRU5ErkJggg==" nextheight="492" nextwidth="2000" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Pre linear perspective art used oblique projection to show 3D objects, but could not correctly converge the lines to a single vanishing point to show realistic depth.</figcaption></figure><p>Armed with perspective as a new technique, the next century was depicted with incredible realism by Renaissance artists, and funded by the rising merchant classes. Some commissioned pieces with a focus on society, and others, in a move to gain influence over city affairs, paid for paintings depicting religious scenes, producing iconic works like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://commons.wikimedia.org/wiki/File:The-Last-Supper-Restored-Da-Vinci_32x16.jpg">The Last Supper</a> or the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.wikiart.org/en/michelangelo/the-creation-of-adam-1512">Creation of Adam</a>. With the general acceptance of science and upheaval of the feudal system underway, the ever more dynamic class of wealthy patrons accelerated art movements over the next four centuries. They left behind an exaggerated, elegant, style of Mannerism, and the epic heavenly scenes of Baroque art which acted as a tool for competing religions in Europe to inspire new followings.</p><p>From competing religions to competing social classes, new forms of art were being leveraged to produce grander and more exciting images. But while artists worked to push the boundaries of painting and sculpture, a new form of competition was emerging. It was the biggest revelation since linear perspective but instead of enabling artists, it posed an existential threat to their work – and it would change how we see the world forever.</p><p>At a demonstration in Paris in 1839, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.metmuseum.org/toah/hd/dagu/hd_dagu.htm">Louis Daguerre</a> demonstrated the first production-ready attempt to capture photographs. Suddenly the primary income source of many artists — portraits for rich families — could be replaced at a fraction of the cost, and their overall ability to produce any painting as detailed as a photograph was being questioned. The demonstration marked an instant change in attitude towards what art had to be, and initiated a major shift away from painting with the goal of accurately depicting nature. Just a few years after Daguerre’s demonstration, in the very country where the first photograph had been captured, the most controversial movement in art history was about to begin.</p><p>The only gallery to accommodate them became known as “the house of mental health”, and critics mostly described the work as unfinished, joking that they must be insane to show their paintings to the public. But what Pissarro, Monet and the other artists who became known as the Impressionists had done, was abandon the notion that art had to represent the real world, follow an existing school of thought, or restrict creativity to constructing heavenly scenes.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/537dd7e5c4115761f292a1de531fd089.png" alt="" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAICAIAAAAX52r4AAAACXBIWXMAAAsTAAALEwEAmpwYAAABhUlEQVR4nJWSXWodMQyFvdruq1sIoQsIhZbkjv/GljW2Z6Z3mnDz0KaQPBQSwglncp9Da4QRsiV9R7ZxikPGkBEVfkTuGAuiQGakCqf0rSCusAmxIgi8wu977nRS5YVDRFCkjNThEnLh7hSmrbjbMES0I0rD3Fh6OcFXBl1EyYyMytPSyGEzvnnYCF0QPSTRqSumFWVG/4kcmSsJKcJETwoptFjhMwZBu0OorHWYyVWPhA0KOyMp7H4zT4Qd3vUV7oMgdkq0FakQ0dsXEy1Zcse1ZdtayFtWNGWDbUEKRLNC/LZh/kXq6DHfktENlN70LDRN8Mur7Ph5wtX4bFImbKjsHxILSTvPPVSK6wvnkwvZvSC3ffq7iFFhlREnPLKFmqTsL7SbLjDuBjURoSk2YPuBPw+4P0Hl9evVX29f+OyK4z0GT0BJHDcBOyVeXmzfOySi3Z7TbwTlBHnA8oQv4bf5YH3+BGNMELiJmq4DVeaCaaa9N/4o/3/X5cUmhZ9V5PHf094AMuInHsKEvDwAAAAASUVORK5CYII=" nextheight="475" nextwidth="2000" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The hazy sunsets and waving, water-like outlines unlocked a creative freedom which allowed every artist to develop their own view of the same scene. For Pissarro soft tones and blurred edges, for Monet bold colour and thick lines. While the paintings were artistically interesting, owning one meant more than having something to hang on your wall. It meant holding a unique piece of art, with the signature style of the artist ingrained into it, and openly adopting the new style despite criticism from the public. Driven by the new paradigm of the post-photography world, the Impressionists produced art which was a reaction to new technology, and also immune to its’ threat of replacing them.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a84c07c8ff07324f86e6f327a45c30c0.png" alt="Late Afternoon in our Meadow - Camille Pissarro &amp; Mont Sainte-Victoire - Paul Cezanne " title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAANCAIAAABHKvtLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE+ElEQVR4nAHtBBL7AMLIwbm9ubW7srnAtrC3qsDDr8XIvcTEtcTFutXVvuTcuuDZud3UtOPbudXLqqCtiYi2i6LHopjEqozHuYTEt5jKr6rQtqvSwa/WyKvUyLbTwMrZvsrYx6/JtqPEtqG7oADLyLbKyri/xLbIzLqorY++wJzY177N0LrPzrvY2cTU1b7DxK3CvZ20tJqbo45ngl+fwIKkzZ+gy62iz7ubzrmk2say2Me31MLF3c7I5dXU5tLl7NXl5cbE17mwyKCmvZIArLOfwMKrqbOgmaeUhI94tLef1dXE1NK02dW63ti11NG6mKeUbYFtdod4WHJdYoZJtMeHpM2ft9Km1ezQ0OrIoMCogo9s0atjx7aB0tjB///u6O7U2uO+0d67xNKsucqnAJWfhpunipykjYqViGV6Z6uznNjWwdfSvdjUvdzVuOPYu4ubflNrVFVtVTpVQmB7V8fjqMPiwM7eubzDlnyJZEtgSYqFVuW7ZNSyX5eOTrO/rvf25fr/4/Dz4NLfz8rcvgBVbUhYckhme1R4hmFgdlp9jGm0uKOiqpOIknd/jnmAjnFLZUw9U0FNZUozVj9cdlyRo3RwgVo7V0YnQTFHYEVHYEKEdj3VoU2yjUGKfkiDd0VdVzqbkHbW0baZoI1xd1wATWVMYXJFX3FDXHFIRF5LUGtTY3xjTWVHT2ZCVWlEVmw9WWo+PVVCOFdMN1NBRVMwACodOUkfUFgcFTseK0IlUlszTFY4VVMqZmY+hXhMknY8fVYeXUQRFzEfABgEBB0KAENeSmBzSkxhQlVtTTxaWVBqYGZ3TlBgOlVjRGZ2WmZ0Zmp1Z3KAZm17cmJyaXx4VTtSLzdQI3V1Fn12I0hgKzxZNT9YLzJUHmZwMoeBLm1yKlZcJG1mIhw5HiExHi43HQB1hFZvfVJsekyGkFSBjVmCiVyQl1eEiU6clFa8r2i0qWOyr2e0rWm7tG2mpHCnkmlCYTQAMRMjVhaHfRtzfS9ceDNWYiBgcSRxgzZ0jEJ+lzZmcB9OaBo/YSZJXSlwciUAraFnr6Fhs6Fdvaxgtq1gxLBkv6tpq55msaBqp5hurp9nwrBvy7Zwyrlsm5FlXnBRSFEANC8AS00Ja1IACCoAACUABEIAQFUFk24UkIcafXUZdXgleYsoSVYMKUcOXXoaALmffbuhZ8GmZ72iaMWndMqnd8iqdbGga6OQaaKMaKiYdrOjf7Ojd6WeeYaDdFxlU1RiAJBnADQgABYPAAEaAAAQAABAADljDpRWAIxbABwrAAg9CFplD6WdJoGVMWGDNQDDqWq+o2C8omHGpGLAoWDCpWO4p2aypWS0o2HIqmmrn22QlGqUkWaUlWmSlXNWVjwiPwAwTgcADgAiMgBdUQAfMAANSAAuTgA4QQBpXxFYVwhYZho3VR9mbA6CahWMlTsA2rl92rl2xq1rtKdquaptyrNp0bVy07huzbFu0LJz27tv68J77sB/9MaBvat/GismAAAAN0cAAAAAAA4ADzkAgE4An3YASkEAo3wAcGoAdHUEjZk+YoMuRkgAT0YAYHkgALmgY5+WaIKKaZOTcL+dZsuhZMegYL6ga7mkabqkW8anYdasdtascdKlbZ6TdyItJz0QAHRBAGhCAFg9AC8eAFY7AKBwAFFOAJZvAIRgAJBTAMd4AMCEALl9AKSJAJ1+EV76W0bAPzvaAAAAAElFTkSuQmCC" nextheight="791" nextwidth="2000" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Late Afternoon in our Meadow - Camille Pissarro &amp; Mont Sainte-Victoire - Paul Cezanne</figcaption></figure><p>One step removed from reality, and no longer constrained by conventional schools of thought, art over the next century accelerated at an even greater pace than during the Renaissance. From the purely geometric forms of Cubism, to the incoherent blobs of abstract impressionism, decades could be defined by a style that would be unthinkable just a couple of years before. And as the idols of the day shifted from celebrities in the 1960s to opinionated graffiti artists of the 1980s, art transformed from the coloured portrait prints of Warhol to the lined drawings of Haring scribbled in the New York subway, and shared by media outlets on TV.</p><p>It wasn’t long before technology itself became the idol of society. With the adoption of the internet in the 1990s the world migrated to online life, and over the next couple of decades everything from bank accounts to social lives would be handled on the internet. Soon enough the emergence of blockchains produced the purest form of a connected society, removing the need for centralised hosts, and offering secure ownership of assets. Blockchains were to finance, what the Impressionist movement was to art – a detachment from the established system by a group on the fringes of society, a stripped-back version of what a financial system should look like, and an opportunity that could unlock an era of creative freedom for anyone brave enough to adopt it.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9644f5bc7af5109b42a1c35c9dd27df0.png" alt="" title="null" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAAAsTAAALEwEAmpwYAAACAklEQVR4nI2S3WrcMBCF9WZ5CkNqWf/jkeTNFvoEvmxLKWuv/qwNS8hFb/YlU+Q0NIVSKoRuRuc7c0YihBCKUY6JYuC4gbsIW5jLzGfuMh+DxGR8EhiZjRwTc7mfIvdJu3XwiWFiNgpbOG66EdJgi8aNQzG2EEII4hdjHl83Ozxr/XWaohCRHZ75sSqf2SEon5W69v6zUleKlWG910Edr7r1kRBrN0UxPTmXB5eVWhvqYxW2DC4TboOa6oCJ+yRxg4cLOwTmgsDIbRmw3vvEfGIu3GMQmITLgw0DxgGjdJliUvZszNIktjTVfplBM6O2kLu7WbssbeGtfJYYlC3ancBnOF7g4axdpu6kjlcBJwYB4CKb01nrSMcq93mKJsnSLsquzKSWDCtA7LqZzPOssApTqK+9X5U9c6wKq7GF7ko25g+4AbSS8YnuCZQtPVbpk4RMMTKfNQZjFmnbM4x+l2Mkf64XQgjDSjHIMSmM1C/SZWMWvccCiP1uw22RPoHLAqvE0E8n45N0WY5LN72DzvN79DzPzUDsYo1BHzbp2kfSOupfQ1i0W7VbhS2NbgtrWVuVYnsAjZsQT6/o+R39XwuxaozNT596aN8UpmhMBMjgcw+x+/T9v0C/s7y8tCxvZ9fdjsdViKdh+Ob9jx4C88mYx2mKHX6hx/V2u711/PeufwKgy0nsCq/3DgAAAABJRU5ErkJggg==" nextheight="580" nextwidth="2000" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>In another parallel to the Impressionist movement, the critical response was pretty much in line with what was written in France over a century before – that anyone valuing a currency on a blockchain was insane. When NFTs emerged, they too drew questions. The images were nothing new, so what was valuable or interesting about a JPEG that could be saved and copied a million times? In a sense, early NFTs were not an abstraction of a particular style of art, but of art itself, the value was not in the image, but in the fact that it was a symbol of the new emerging financial system. In time other NFT projects emerged with a range of utilities, some as purely aesthetic images to collect, others with built-in functionality to unlock memberships or reward followers.</p><p>But besides utility or aesthetics, Claude Monet paintings and Crypto Punk NFTs derive their extreme valuations from something much harder to replicate. They both mark significant moments in art history where artists adapted to a new technology, and produced works that would define that period for years to come. To own an Impressionist painting in 1880 was to voice support for a new movement of art, to own one now is to hold a slice of history that has earned itself a price tag in the tens of millions. Buying into the first NFT collections was to adopt a new era of finance and put trust in a decentralised network unlike anything seen before.</p><p>As the fallout from the last NFT hype cycle settles, it seems another pivotal movement in art is just beginning. The rise of AI-generated content is causing reactions on par with the early development of photography back in 1839. It’s easy to look back in hindsight and feel that the Impressionists’ success was inevitable, or that NFTs were certain to make it into museums eventually. But in reality, things are less clear in the moment. AI could end human-produced art forever, it could enable a period of creativity like never before, or it could still fizzle out and be forgotten. We can speculate over which way AI art will develop, how the Impressionists will be viewed in 100 years, and whether NFTs can cement their place in everyday life, but in the end, knowing for sure is impossible. And as we have found in the past, we might even be lacking the right perspective to know what we're missing.</p><p><strong>If you made it this far, you may be interested in the following:</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/james_mccomish">james_mccomish</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://shs.hal.science/halshs-00479821/document">Why Did Geometrical Optics not Lead to Perspective in Medieval Islam?</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://drawingacademy.com/brunelleschi-rediscovers-linear-perspective">Brunelleschi ‘Rediscovers’ Linear Perspective</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.metmuseum.org/toah/hd/dagu/hd_dagu.htm">Daguerre (1787–1851) and the Invention of Photography</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://useum.org/exhibition/curated/Impressionism/Early-Criticism">Early Criticism of Impressionism</a></p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/470d601bff0933c94b6e67a1595a5eae.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Digital Gold to Digital Goals]]></title>
            <link>https://paragraph.com/@jamesmccomish/digital-gold-to-digital-goals</link>
            <guid>srtBKheldSV7Z2cXcAHq</guid>
            <pubDate>Sun, 28 Aug 2022 20:32:42 GMT</pubDate>
            <description><![CDATA[If someone sent you a message today saying “QWERTYUIOP”, you probably wouldn’t be all that impressed… But take things back to 1971 when Ray Tomlinson sent this as the first ever ‘electronic mail’ and you would have felt very different. ]]></description>
            <content:encoded><![CDATA[<p>If someone sent you a message today saying “QWERTYUIOP”, you probably wouldn’t be all that impressed… But take things back to 1971 when Ray Tomlinson sent this as the first ever ‘electronic mail’ and you would have felt very different. In a similar light, the projects making the headlines in Decentralised Finance today might one day become commonplace, but until then, maybe they deserve the hype.</p><p>The early internet is about the only technology that can approximately size the impact that blockchain based technologies promise to deliver. As the internet revolutionised how information was stored and shared, many ‘pre-internet’ styles of work looked unlikely to survive. In the same way, blockchain based networks promise to upend decades of consolidation of power by the tech giants we know (and love?) today. Although comparable in the ambition of their goals (and perhaps hype created in the media) one notable difference between the old and new networks is the initial use case which they emerged from. The early internet promised unrestrained movement of information, while the blockchain revolution pitched itself on the promise of unrestrained financial freedom.</p><p>As early as 1982 there were movements towards a secure digital currency in the form of David Chaum’s paper, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sceweb.sce.uhcl.edu/yang/teaching/csci5234WebSecurityFall2011/Chaum-blind-signatures.PDF">Blind Signatures for Untraceable Payments</a> . Chaum developed the idea into one of the earliest attempts at what would be comparable to the cryptocurrencies of today, DigiCash. By letting both sender and receiver digitally sign and encrypt transactions DigiCash made it possible to anonymise transfers of cash, but it failed to achieve full decentralisation as the role of the bank still existed to handle the collection of funds.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/25879037c70e021a673be337edabbad6.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAPCAIAAAAK4lpAAAAACXBIWXMAABcRAAAXEQHKJvM/AAAD0UlEQVR4nJWUMWjcVhjHtd6QLge+cnDDDYKjuUGDqEjPICzKCW44UoE1XIoMgkaDaTRc4geNsD1oOGhUokFDFQelFvQWkbxBKQgaDYIi8FsEjZryhjdUg5dbbrnB0KhYz66hpIX+pu/Te+iv9//+ekxd177vK4piWdZ8Pn/3+7v6Q1xcXPxH/W+rdV0zdV1HUXRwcKAoynA49DyvKIowDKMoyhuCIAjDECGU5zmEsCgKhNBPr1//cHoaxzFCKI7jPM/TNIUQOo6TJInneWmaUrFLAYRQGIa6rouiCADQdf3WR7dGo5Ek7ciy3O/3WZadTqeS9DkAQNO0WcOdz+6MRiOO44bD4Xw+Zxim1Wq12+3ZbKaqapIkNwKGYTAMw7KsaZqyLJumyXHc8fHxYDBgWVYQBFmW6Uv3G3ieBwDYti0IAs/z3W633+/P5w9nsxnHcYZhyLI8mUxkWUYIXQrYtt1ut3Vdtyxrd3f37hd3Hz18pKqqKIqWZRkNrusahgEA8DxPknbu3//q6wcPAACdTkcUxeFwOBqN9vf3Vw2EkF/fvi2KYrPZXAqsVquyLKtrMMZVVRUN+LL+o6qqsmG9XhNCyvK31WpFh5HneZZltM3znO7555CzLIuiKEkS0zQFQRBFUVEUVVV1XVdV9fDo0HEcXden06mmaaqqUqO2t7fp2BiGcRyn1+sJgtDtdh3HieM4CIKiKK4EaLDC8HQwGCiK0uv1BoOBJO3s7e11Oh8LwqcMw0ynU2pXHMe+71uWRQOTJAkAAEIIAFgulyfPTl6+eum67mKxQAhdCVAwxsvlsqqqOI6zLEMIlWVJ6zAM0zQlhGw2m/p/cmURTfpyudQ07ZvHj23b/s5xbNt2HAcAcHZ29iJ44TgOhDAIAtd9qmmaYRgQQoTQbDYzTRMAIIqibdv0rJZlEUKuYlpV1Wq18jxvPB7zPC8IQrvdnkwmNIiapo3HYwBAEAS+//1isTBNcz6f37v35eHREW1lWQYAKA0cxwVBAAAQBAFjfCnw5/v3dV3//ObNU9el4qq6q2ma53kY47qu1+s1NefiGtpuNhuamb+ff9giGsrz83NCCMa4LEuEECGEJjXLMowxLcqyzLJsvV5XVQUhxBinaRpFUZPXXzDGJ89P6DXj+z79iJuYQgj7/T5zjaIok8mEYRiO41iW3drakiRJbtA0bbFYfHL7Ns/znU6HYRjTNPsNrVar1+vJshwEAT3QTYoIIa7rNkb7SZIURZGm6bdPnpwh5Ps+hK8IIQihJmw/Zg2u68IGQkgQBPSOi+OY/gHUor8AXKWBn83SUlgAAAAASUVORK5CYII=" nextheight="433" nextwidth="940" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Clip from Blind Signatures for Untraceable Payments</figcaption></figure><p>While DigiCash failed to catch on at the time, it laid the foundations for a world where people could make secure digital payments between themselves. In the years that followed Chaum’s paper a number of factors combined which let people dream not only of securely sending money to each other, but to reshape the very network over which the money would be shared. They included:</p><ul><li><p>Public availability of strong cryptography from the early 1990s</p></li><li><p>Ability to attain cheap computers powerful enough to compute many hash functions in a reasonable timeframe</p></li><li><p>Abundant access to the internet with increasing speed</p></li></ul><p>Suddenly it became feasible that if enough participants were to coordinate, a structure similar to the internet, but without any reliance on a few dominant providers, or the need for central storage, could be created. If a financial tool which was secure like DigiCash could be hosted in a distributed manner on such a network, then the role of central banks could be removed entirely, but unfortunately so would any value of the transactions. If a decentralised cryptocurrency was to emerge, it would not only need to be self-sustaining technically, but also be valuable in the eyes of the public.</p><p>Although the task of generating real-world value for a completely new digital asset would be a complicated one, just putting the word ‘gold’ in its name was certainly not a bad place to start. Bit Gold, described by Nick Szabo in 1998, built on top of the encryption and secure transfer methods demonstrated by DigiCash but also solved the problem of generating itself value. Bit Gold was not initially intended to be a payment method or direct currency, but rather a reserve currency which could be used to regulate the distribution of other digital currencies.</p><p>Bit Gold’s value derived itself from the cryptographic proof known as ‘proof-of-work’ (POW) developed some years before by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.wisdom.weizmann.ac.il/~naor/">Moni Naor</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dwork.seas.harvard.edu/detailed-biography-and-curriculum-vitae">Cynthia Dwork</a>. POW, which was already used by spam protection software such as <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.hashcash.org/">HashCash</a>, meant that creation, or ‘mining’, of new Bit Gold would take roughly predictable amounts of computational power and therefore energy. This investment of energy to create new strings of Bit Gold meant that those who performed the calculations held difficult to attain items. These could then be perceived as valuable to people who wanted to trade scarce items similar to real world gold.</p><p>Given the fact that DigiCash existed over 15 years before Bit Gold, and the fact that Szabo was an active, well connected, member in the world of cryptography, it is interesting that Bit Gold never progressed beyond a few half-finished papers. Having come so close to creation it was not tested at scale in the real world and was almost unmentioned until it resurfaced in 2008. It’s hard to say why Szabo put the idea aside, but during the early 2000s he obtained a law degree from University of Washington with the intention of digitising contract law, something we’ll revisit later. Another possible distraction which may have delayed the first widely accepted digital currency was Szabo’s blog ‘Unenumerated’, which regularly published a bewildering set of articles covering everything from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://unenumerated.blogspot.com/2006/11/are-green-beards-ubiquitous.html">“Why are Green Beards Ubiquitous”</a>, to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://unenumerated.blogspot.com/2011/06/agricultural-consequences-of-black.html">“The Agricultural Consequences of the Black Plague”</a>. A decade well spent, I’d say.</p><p>Just as Szabo resurfaced Bit Gold in 2008, the first sighting of what is todays largest cryptocurrency, Bitcoin, appeared. Bitcoin made a number of improvements which allowed it to be less susceptible to variations in computing power (an issue which would cause unpredictable inflation in Bit Gold), and also more secure in protecting itself from malicious actors trying to take control of the blockchain. Maybe the most notable improvement of Bitcoin was that it made it off the drawing board and into the public domain. Not only did Bitcoin give the world a decentralised financial asset which could be owned and traded anonymously, it also, fitting well with its original intention, gave the world an anonymous creator to speculate over.</p><p>The now infamous Satoshi Nakamoto takes credit for creating Bitcoin, and in a nod to their predecessors sent the first Bitcoin transactions to Hal Finny (a pioneer of cryptography and contributor to the improvements which Bitcoin made on Bit Gold), Nic Szabo, and Wei Dai (another prominent cryptographer who lends one of his names to a denomination of Ethereum, and the other to one of the world’s largest stable coins). With the first widely accepted digital cryptocurrency in use, it did not take long for the asset to begin to translate into conventional fiat value. And as with any new tech, there were a number of novel moments which made their way into folklore. One transaction remembered as “Bitcoin Pizza Day” is celebrated on 22nd May to commemorate the day a Bitcoin miner from Florida bought 2 pizzas for 10000 bitcoin, worth over $300 million today. But among the technical excitement and public scepticism there were people already beginning to ask, “well what next?”</p><p>With the lofty goal of connecting people across the world with an anonymously traded digital currency, un-corruptible by central parties nearing realization, attention moved beyond finance. Interest shifted from transparent connection of currency on a global scale, to transparent coordination of people on a <strong>project scale</strong>. The emergence of Ethereum, pioneered by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vitalik.ca/">Vitalik Butlerin</a> in 2013, was the first step towards accommodating a layer of logic which would transform blockchains from a store of value into a decentralised machine capable of executing financial and non-financial actions.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/281e5f21c60ce4017cbaac2d7958cd8b.png" alt="Ethereum team and devs at DEVCON-0 (2014)" title="null" blurdataurl="data:image/png;base64,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" nextheight="625" nextwidth="940" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Ethereum team and devs at DEVCON-0 (2014)</figcaption></figure><p>The logic for applications was built into ‘smart contracts’ which could be deployed and publicly visible to all, but never edited in any way. This opened possibilities for people to code agreements which could be automatically executed if certain conditions were met, or if certain inputs were sent via a ‘transaction’. The flexibility of these contracts meant that people could code almost any set of transactions, including the creation of their own ‘currency’ or ‘token’ which could then be traded with others. Although Bitcoin did have basic smart contracts built in, it lacked the flexibility to create such elaborate code, instead focused on maintaining high security and compatibility with its existing transactions.</p><p>The openness of Ethereum to let creators loose to build ever more complicated interactions was not without its problems. As the desire to coordinate people rather than blocks of financial data grew, so did the potential that holes in the logic of smart contracts could be exploited. One of the earliest large profile projects on the blockchain was <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/blockchainsllc/DAO">The DAO</a> a “Decentralised Autonomous Organisation” with the goal of crowd funding for the Ethereum Foundation. The visibility of the source code meant a bug could be easily seen and exploited, and the inability to alter the code left The DAO suffering over $50 million in losses which caused long lasting consequence on the Ethereum blockchain.</p><p>Despite some early setbacks, Ethereum led the way for future DAO projects which were increasingly used to shift real world decision making on chain. From crowd funding projects, to organising protocols by transparent voting mechanisms, the role of smart contracts has revolutionised how organisations form, reach decisions, and interface with the public in the same ways the early internet changed how information was presented and shared across the world.</p><p>Whether the decentralised and secure nature of blockchains today can hold up against impending regulation and the challenges of scaling to accommodate the next wave of adopters remains to be seen. It will depend on the builders across every blockchain, protocol, or application. But if those builders are anything like Chaum who wrote a seminal paper on digital currency on a typewriter, Vitalik who recovered the Ethereum foundation from a $50 million hack, or Szabo who managed to master cryptography, contract law and the complex world of green beards, they might just be good enough to make it happen.</p>]]></content:encoded>
            <author>jamesmccomish@newsletter.paragraph.com (jamco.eth)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/ee908b46475712fe153de776b5abcb9a.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>