<?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>depatchedmode</title>
        <link>https://paragraph.com/@depatchedmode-2</link>
        <description>walking, talking synthesizer</description>
        <lastBuildDate>Sun, 02 Aug 2026 09:13:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>depatchedmode</title>
            <url>https://storage.googleapis.com/papyrus_images/b7478ac279882c0383dc43a17b8464280a10da8555eb8a160c66ec72dbfba0a0.png</url>
            <link>https://paragraph.com/@depatchedmode-2</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Secure Design: A Draft of 7 Principles]]></title>
            <link>https://paragraph.com/@depatchedmode-2/secure-design-a-draft-of-7-principles</link>
            <guid>CZYKwH2PPIwTK788Hv71</guid>
            <pubDate>Wed, 22 Mar 2023 17:46:44 GMT</pubDate>
            <description><![CDATA[https://twitter.com/punk6529/status/1626557046819520514?s=20Something&apos;s not rightNo matter which version of the web you believe we are currently on, our situation is far from ideal. We are still missing fundamental pieces. This is not to suggest progress has halted. So many communities continue to contribute so much! But we often overstate our position on the roadmap. There has not been a Web 1, Web 2, or Web 3. Instead, there has been a Web 0.1, Web 0.2, and Web 0.3.We are still increme...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/punk6529/status/1626557046819520514?s=20">https://twitter.com/punk6529/status/1626557046819520514?s=20</a></p><h2 id="h-somethings-not-right" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Something&apos;s not right</h2><p>No matter which version of the web you believe we are currently on, our situation is far from ideal. We are still missing fundamental pieces.</p><p>This is not to suggest progress has halted. So many communities continue to contribute so much! But we often overstate our position on the roadmap. There has not been a Web 1, Web 2, or Web 3. Instead, there has been a Web 0.1, Web 0.2, and Web 0.3.</p><h2 id="h-we-are-still-incrementing-on-web-0x" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">We are still incrementing on Web 0.x</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/55e983f5bd11a83a93b4ed8b44720c2eda2adc0cde3016e1335f9f6d388dac4d.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We are not yet feature-complete. How do we know this? Because basic agency does not yet exist. Let&apos;s express a claim:</p><blockquote><p>As a person living in a digitally-mediated world, regardless of my degree of data literacy and technical proficiency, I must be empowered to make my own decisions with my data. To make the right decisions for me and for the communities I inhabit.</p></blockquote><p>Does this claim hold true today? In the worst case, it is not even possible for me to make the right decisions with my data (e.g. moving the personal relationships I&apos;ve built on Facebook to another platform). In the best case, it may be possible but is far from obvious to most how they would do it (e.g. moving my email history from Gmail to a new client).</p><p>We have failed to meet an acceptable standard.</p><h2 id="h-possible-probable" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Possible != Probable</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ba95b69a8b418672261f22bf2b0c8223b2db46c0dba11c39470e8770f156b8c1.gif" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Simply making a secure outcome <em>possible</em> does not make it <em>probable</em>.</p><p><em>Secure</em> means so much more than just “security at the technical layer.” It means enabling an environment and set of relations between individuals, that empowers <em>communities</em> to operate as they wish or need to.</p><p>The broken systems we rely on today must do more. They must ensure our experiences are secure by design — and designed thoughtfully enough to provide us with the agency we deserve. From concept, all the way down to code, and back up again: into the interfaces that govern our interactions.</p><p>The user experience of our digital existence must place every person, regardless of ability, in a position to be secure with their data. A truly secure system needs to be:</p><ol><li><p><strong>Easy &amp; Obvious</strong>: Most vulnerabilities in a system occur when we find insecure workarounds, so the secure path must be the easiest and most obvious path for us to take.</p></li><li><p><strong>Maximally De-risked</strong>: It is not realistic to expect us to be experts in keeping things secure. Therefore, systems must take the responsibility to reduce our risk by default as much as possible.</p></li><li><p><strong>Just Granular Enough</strong>: We should have control over what we permit other systems, individuals, and organizations to see and do with our data. However, this control should not be so granular that it becomes overwhelming and burdensome for us to set up and maintain.</p></li><li><p><strong>Sufficiently Legible</strong>: Informed consent is critical. We must be able to understand the actions and outcomes before we take those actions. Actors and objects in the system should also be labeled clearly and in a way that we can quickly understand.</p></li><li><p><strong>Sufficiently Auditable</strong>: Mistakes will be made. All actions taken on our data should be auditable &amp; reversible. All permissions we delegate should be revokable. Parts of our history should be ejectable.</p></li><li><p><strong>Aware Things Change:</strong> Nothing is forever. Our circumstances may change; the world may change. We need optionality to move our data, adjust our threat models, and rotate our security factors.</p></li><li><p><strong>Reflective of My Intentions</strong>: Most critically, the system must still enable us do what we intend to do. It must allow us to present ourselves to the world in the many ways we desire or need to be presented.</p></li></ol><p>This list above is forever indebted to the work that came before us in what some have begun to refer to as the Pyramid of Secure Design — happy to turn it into a more complex polygon, though:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www2.eecs.berkeley.edu/Pubs/TechRpts/2002/CSD-02-1184.pdf">User Interaction Design for Secure Systems</a> by Ka-Ping Yee</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www2.eecs.berkeley.edu/Pubs/TechRpts/2002/CSD-02-1184.pdf">Rich Sharing for the Web</a> by Marc Stiegler</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ipc.on.ca/wp-content/uploads/Resources/7foundationalprinciples.pdf">Privacy by Design</a> by Ann Cavoukian</p></li></ul><h2 id="h-what-can-you-do" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What can you do?</h2><ol><li><p><strong>I would love your feedback</strong>, or links to any related initiatives. I&apos;m still learning and exploring, and I&apos;m sure there are a mountain of previous thoughts on these matters.</p></li><li><p><strong>Join our working group.</strong> This is a very rough draft, to help focus the initial conversations we are having in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/SecureDesignWG">Secure Design Working Group</a>. If any of this resonates with you, positively or critically, I urge you to join us in our effort to articulate a clearer path to secure outcomes.</p></li><li><p><strong>Let’s develop heuristics to help evaluate the principles</strong>. Once we have a first version of these principles in a place we&apos;re happy with, I&apos;d love to equip folks technical and non-technical alike with a checklist of heuristics they can apply to systems they build or use to asses whether these principles are being upheld.</p></li><li><p><strong>Share your work</strong> — whether that’s putting your own thoughts in to writing, sharing your team’s research findings, or publishing your patterns (like the great work being done at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://decentpatterns.com">decentpatterns.com</a>).</p></li></ol><p>🤝</p><hr><p>Ryan leads design at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://fission.codes">Fission</a> where he’s working on UX and DX patterns for the future of the Internet, alongside some protocol engineering phenoms. You can find him wherever he is under the alias <code>depatchedmode</code>.</p>]]></content:encoded>
            <author>depatchedmode-2@newsletter.paragraph.com (depatchedmode)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/50ecf435326afe6dcfd2bbdb107ea27194f14fcb76bce7de58630f0ad67b3650.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The Wallet Stack]]></title>
            <link>https://paragraph.com/@depatchedmode-2/the-wallet-stack</link>
            <guid>ogwVRoua6amNZbKmG2h6</guid>
            <pubDate>Wed, 01 Jun 2022 06:59:10 GMT</pubDate>
            <description><![CDATA[The word “wallet” gets used a lot, but is rarely defined. Whether you&apos;re fresh to web3 or a seasoned veteran, you&apos;ve likely felt this confusion. Even worse: maybe you don&apos;t know you&apos;re confused? Let me explain.What Is a Wallet?"Which wallet should I use?""What wallet should I send this to?""Can I import my wallet?"In each of these questions, "wallet" refers to a completely different part of the Wallet Stack: a Wallet Client, an Account & Account Address, and a Recovery Met...]]></description>
            <content:encoded><![CDATA[<p>The word “wallet” gets used a lot, but is rarely defined. Whether you&apos;re fresh to web3 or a seasoned veteran, you&apos;ve likely felt this confusion. Even worse: maybe you don&apos;t know you&apos;re confused? Let me explain.</p><h2 id="h-what-is-a-wallet" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What Is a Wallet?</h2><ul><li><p>&quot;Which <em>wallet</em> should I use?&quot;</p></li><li><p>&quot;What <em>wallet</em> should I send this to?&quot;</p></li><li><p>&quot;Can I import my <em>wallet</em>?&quot;</p></li></ul><p>In each of these questions, &quot;wallet&quot; refers to a <em>completely</em> different part of the <strong>Wallet Stack</strong>: a <code>Wallet Client</code>, an <code>Account &amp; Account Address</code>, and a <code>Recovery Method</code>—which itself infers the existence of a <code>Wallet Structure</code>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ba379ab04eac08fd60dabf5df8868247e4a7a2004b027145183f8e299f62b23a.png" alt="The Wallet Stack consists of: a Wallet Client, a Recovery Method &amp; Wallet Structure, and and Account &amp; Address." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The Wallet Stack consists of: a Wallet Client, a Recovery Method &amp; Wallet Structure, and and Account &amp; Address.</figcaption></figure><p>Colloquially, calling every part of the stack a &quot;wallet&quot; isn&apos;t an issue. For many people right now, they all indeed <em>feel</em> like the same thing. Where the problem becomes real is in the UI copy itself.</p><p>Across and within various <code>Wallet Clients</code>, the word wallet leaks inconsistently into the user experience. It&apos;s no wonder people get confused. For new users this can be misleading. For experienced users it may never be clear what&apos;s actually going on underneath.</p><p>Let me pick on Coinbase Wallet for a moment to ground this in an example. Not only are they the most successful brand in blockchain, they are also one of the worst abusers of the word wallet.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a46912e7c3eb9bf29cf78f48ee321986a0135c2d6581f4e1585cb22b862f8b65.png" alt="Coinbase Wallet: A tragedy in 3 parts" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Coinbase Wallet: A tragedy in 3 parts</figcaption></figure><p>To enter Coinbase Wallet&apos;s world, one must:</p><ol><li><p>Install Coinbase Wallet (a <code>Wallet Client</code>), which will prompt you to</p></li><li><p>Create a new Wallet (aka set up a new <code>Recovery Method</code> that will generate a password protected <code>Wallet Structure</code>), at which point</p></li><li><p>The app will provision you with 10 Wallets (which are actually 10 <code>Accounts</code> identified by their unique <code>Account Addresses</code>).</p></li></ol><p>Because many people only go through this flow once, and never bother going into settings, their confusion may be fleeting. But can you imagine what internal Coinbase Wallet sprint planning looks like? &quot;Alex, can you fix the bug with wallets being derived non-deterministically from the wallet a user imports into the latest version of our wallet?&quot;</p><p>Poor Alex. Poor us.</p><p>Those of us designing and building need to be more precise. So: let&apos;s get precise.</p><p><strong><em>A couple of notes:</em></strong> <em>This post uses Ethereum examples, but the ideas hold true for smart contract enabled chains in general, and will be identical in practice for all EVM compatible chains. You’ll also notice I’m explicitly not using the word dapp. If a dapp is software whose backend is strictly hosted on a blockchain, that is a subset of all apps. I believe all apps will have wallet interactions in the near future.</em></p><h2 id="h-wallet-clients" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Wallet Clients</h2><p>When someone asks &quot;Which <em>wallet</em> should I use?&quot; what they&apos;re really asking is &quot;Which <em>wallet client</em> should I use?&quot;—examples being Metamask, Rainbow, Coinbase Wallet, a Ledger Nano, or a Gnosis Safe. The <code>Wallet Client</code> is the interface they&apos;ll use to connect to an app, sign messages and transactions, and manage their on-chain assets.</p><h3 id="h-varieties-of-wallet-client" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Varieties Of Wallet Client</h3><p>A wide variety of <code>Wallet Clients</code> exist, and the list grows daily. To thoughtfully recommend one, it&apos;s important to know a bit more about a person&apos;s intentions. What&apos;s their threat model? Which chain(s) are they going to be using? What do they want to <em>do</em> in web3?</p><p>Even with clear answers to those questions, making the right recommendation can be complicated. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/depatchedmode.eth/uxsq5GRcelYkwPB-BicnfjTPisxiNVJCQQ3bIGPPmmQ">There are just so many options out there</a>. It’s helpful to think about the ways you can categorize <code>Wallet Clients</code>:</p><ul><li><p><strong>Software vs Hardware</strong>: Most folks will start out by using a software wallet on their laptop, tablet or phone—either in the form of a native app, web app, or a browser extension. Eventually, they&apos;re going to want more security and are likely to move to something like a Ledger Nano—a dedicated piece of hardware with embedded firmware. Software and hardware clients <em>mostly</em> map to the concept of <em>hot wallets</em> and <em>cold</em> <em>wallets</em> respectively. <em>TLDR: putting valuable assets into cold storage on a hardware wallet client is a good move.</em></p></li><li><p><strong>Finance vs Identity-focused</strong>: Historically, folks have turned to their <code>Wallet Client</code> to manage the financial activity they’re engaged in on-chain: monitoring their portfolio value, or swapping and staking assets. But, over the past year we&apos;ve seen <code>Wallet Clients</code> such as Autonomy and Rainbow begin to support viewing and interacting with an NFT collection, and even constructing public profiles. These features address the emerging desire to garden on-chain identities—or rather, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blog.gnosis.pm/inventories-not-identities-7da9a4ec5a3e">inventories</a>.</p></li><li><p><strong>Single vs Multi-chain</strong>: Most <code>Wallet Clients</code> focus on support for a single blockchain ecosystem: Metamask on Ethereum, Phantom on Solana, Kepler on Cosmos, or Kukai on Tezos. But there <em>are</em> options that support multiple chains from a single interface. Trust Wallet may have the broadest blockchain support out of the box, while Metamask has begun supporting additional blockchain networks via its 3rd party Snaps add-ons. Single chain <code>Wallet Clients</code> tend to be more mature and have better UX, but multi-chain clients are the final destination.</p></li><li><p><strong>EOA vs Contract-based</strong>: Signing transactions and messages (for better and for worse) is the backbone of web3 experiences. Most <code>Wallet Clients</code> rely on Externally Owned Accounts (EOAs) under the hood and require a single signature to “okay” a transaction—we&apos;ll explain this in more depth shortly. When you want to up your security, diversify your recovery paths, bundle transactions, set spending limits, or support other sophisticated organizational workflows, there are also contract-based clients. Gnosis Safe and Argent are examples of contract-based clients that enable features such as multiple signatures (multi-sigs) to process a transaction. <em>Beware: not all apps support multi-sigs directly.</em></p></li></ul><h3 id="h-challenges-wallet-clients-face" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Challenges Wallet Clients Face</h3><ul><li><p><strong>Overloaded Scope</strong>: At this moment in time, <code>Wallet Clients</code> pull triple duty in the web3 space, handling: private key management, application UI, and transaction/asset management. Billy Rennekamp explains how this could be restructured with his proposed <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://billyrennekamp.medium.com/account-coordinator-a-proposal-for-the-future-of-wallets-9fc54032a202">Account Coordinator</a> pattern.</p></li><li><p><strong>Not Being Metamask:</strong> If you&apos;re using anything other than Metamask, chances are high you&apos;re connecting your <code>Wallet Client</code> to an app using a wallet transport layer like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://walletconnect.com/">Wallet Connect</a>. Or you’re hoping your <code>Wallet Client</code> has decided to emulate Metamask.</p></li><li><p><strong>Poor Mobile Support:</strong> On mobile, most apps expect you to copy the URL to your clipboard, open your <code>Wallet Client</code>, launch its in-app web browser, and then paste the URL. Once again, implementing <code>Wallet Connect</code> in your app helps alleviate this and allows your users use their mobile browser of choice. <em>As a sidenote, most web3-enabled apps are neither responsive nor mobile-friendly; it is imperative that developers and designers adopt a </em><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://css-tricks.com/how-to-develop-and-test-a-mobile-first-design-in-2021/"><em>mobile first approach to user experience</em></a>.</p></li><li><p><strong>Inconsistent Terminology:</strong> Accounts? Wallets? Import? Add? Connect? Link? Different combinations of these words appear all over the place referring to different things. Hopefully this post will help to chip away at some of that confusion, but there is still a lot of ground to cover. It is critical the teams behind <code>Wallet Clients</code> continue to engage in user research to identify the right mental models and terminology to support them—with a mind towards localization as well!</p></li><li><p><strong>No Settings Portability:</strong> If you&apos;ve ever tried migrating to a different instance of Metamask, or from Metamask to Rainbow Wallet—not picking on either of them specifically—you&apos;ve learned with some frustration that you have to setup everything from scratch again: account names, block and allow lists, token lists, network settings, etc. That process is both tedious and error prone to do even once, let alone maintain on an ongoing basis.</p></li><li><p><strong>Centralization Under the Hood:</strong> Many of the user experience improvements wallets have achieved in terms of displaying assets and transaction history have been gained through leveraging highly centralized 3rd party APIs. Moxie Marlinspike published an excellent tear down of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://moxie.org/2022/01/07/web3-first-impressions.html">where this centralization has introduced fragility</a> into the ecosystem. There are better ways.</p></li></ul><h2 id="h-accounts-and-account-addresses" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Accounts &amp; Account Addresses</h2><p>When someone asks &quot;Which <em>wallet</em> should I send this to?&quot; what they&apos;re really asking is &quot;What&apos;s the <em>account address</em> I should send this to?&quot;—the long base-58 string that identifies your account on the chain.</p><p>So, what exactly is the account that address identifies? Well, there are two distinct types.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1bee21d994eddc07c95853c537aaca133dce0d5d0a6c15298d97c8fc03331b17.png" alt="The triangle is, in fact, the strongest shape." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The triangle is, in fact, the strongest shape.</figcaption></figure><p><strong>Externally Owned Accounts (EOAs)</strong>:</p><ul><li><p>live off-chain—ie. they are “external” to the blockchain</p></li><li><p>are controlled by a private key, from which a public key and address are derived</p></li><li><p>are responsible for initiating all transactions</p></li></ul><p><strong>Contract Accounts</strong>:</p><ul><li><p>live on-chain as code</p></li><li><p>are controlled by the functions defined in that on-chain code</p></li><li><p>can only act in response to transactions issued by EOAs</p></li></ul><p>Though Contract Accounts are becoming more common, most people still have EOAs. This is because, even if you use a Contract Account, an EOA must still be present somewhere in the chain to trigger the action you want to take—though there are <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-4337">plans in motion</a> to address this with Account Abstraction.</p><p>With both types of accounts, the <code>Account Address</code> is the way that you refer to it in a transaction.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/87933dcac2dee801de31cb5bc2d015162da56322fcc3b6528320a602664f6d69.png" alt="Differences between EOAs and Contract Accounts" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Differences between EOAs and Contract Accounts</figcaption></figure><h3 id="h-human-readable-aliases" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Human-Readable Aliases</h3><p>Most folks can’t just remember and rattle off the 20 byte long base-58 string that is their <code>Account Address</code>. So, protocols such as ENS allow a human-readable alias to be mapped to any address. The result is that I can invite you to send tips to <code>depatchedmode.eth</code> (🤑) instead of forcing you to test the limits of human memory (and typing skills). Many apps and <code>Wallet Clients</code> support these aliases in both directions: raw addresses will show up as ENS domains when they exist, and pasting ENS domains in various places will resolve to their underlying addresses.</p><p>It is worth underscoring that you <em>can</em> change the address your ENS domain points to, in case you migrate to a new primary account in the future. Because of this, an ENS domain can be a more stable way to identify yourself to other people in much the same way that your phone number remains stable as you move from one home to the next.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5eba9890f76038bfe631eb861223ef6d18ea44ffed453e188bc043cbcb04781e.png" alt="ENS domains can be pointed at an EOA or Contract Account." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">ENS domains can be pointed at an EOA or Contract Account.</figcaption></figure><h3 id="h-whats-in-your-account" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What&apos;s In Your Account?</h3><p><strong>Nothing.</strong> Surprised? This is one of the reasons that many people say a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://gaby.mirror.xyz/0Wq9zk0pZu_s3W1S4BiNcYXw9uSfSVbyGjNPgLHcs18">&quot;wallet&quot; is a broken metaphor.</a> When you think of a wallet, you imagine a thing that:</p><ol><li><p><strong>Contains Stuff:</strong> It’s full of coins, bills and cards that you fold up and slide into your front pocket.</p></li><li><p><strong>Is Default Private:</strong> Nobody can see any of that stuff unless you decide to show them.</p></li></ol><p>The blockchain account you’re managing in your wallet shares neither of those characteristics. A blockchain account:</p><ol><li><p><strong>Contains Nothing:</strong> When I say that nothing is in your account, I mean it. No matter what asset you are referring to, whether it be ETH, an ERC-20, or an NFT, the balance that is attributed to your account is stored elsewhere and points <em>to</em> your account. In the case of an EOA this shouldn&apos;t be surprising, because the assets are on chain and—as we just illustrated—your account <em>is not</em>. The same is true for contract accounts.</p></li><li><p><strong>Is Default Public:</strong> Anyone can look up your ENS domain or public address to see the entire list of current and past assets associated with that account, as well as all its transactions.</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6cc82ffcce7b502bfb4105c77cf42edfd0262d062d9bdebeb42237aaf5a33bd2.png" alt="Realize the truth: there is no wallet." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Realize the truth: there is no wallet.</figcaption></figure><h3 id="h-challenges-that-accounts-face" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Challenges That Accounts Face</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/punk6529/status/1495450982079254541?s=21">https://twitter.com/punk6529/status/1495450982079254541?s=21</a></p><ul><li><p><strong>Account Composition:</strong> Beyond the wallet being a broken metaphor, Dan Finlay has gone so far as to say recently that even &quot;account&quot; is a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/danfinlay/status/1526937584781230081?s=20&amp;t=W4eBXr4S6yUNZ-iSyKZAIg">skeuomorphic dead end</a>. And many folks are weighing in on how you might want to compose your set of accounts in order to best protect yourself against loss and theft.</p></li><li><p><strong>Consent Layer:</strong> Because blockchains are permission-less and the assets are pointed at your address from elsewhere, anybody can put anything &quot;in&quot; your account at any time. This leaves the door open for a great deal of harassment, fraud, and general mischief. We need to carefully consider appropriate counter measures. Where and how does a consent layer (aka requesting permission) best fit into a permission-less system?</p></li><li><p><strong>Multi-chain Address Space:</strong> In many instances, the same addresses can exist on multiple chains and networks. In other instances, it’s impossible for an address on one chain to exist on another. This all comes down to the compatibility of encryption methods used. When someone provides <em>just</em> an <code>Account Address</code> how do you know which chain or network they are targeting? This hasn’t been a problem in single chain <code>Wallet Clients</code>, but in a multi-chain world this problem becomes very real. There are technical standards to address this, but still not many user experience best practices.</p></li><li><p><strong>Nascent Contract Account Support:</strong> As I already mentioned, there are a lot of benefits that Contract Accounts can bring, but they are still not widely supported for interacting with apps.</p></li></ul><h2 id="h-the-recovery-method-and-wallet-structure" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Recovery Method &amp; Wallet Structure</h2><p>When someone asks &quot;Can I import my <em>wallet</em>?&quot; what they&apos;re really asking is &quot;Can I use my <em>recovery method</em> in this <em>wallet client</em> to rebuild the <em>wallet structure</em> that contains all of my <em>accounts</em>?&quot; Bit of a mouthful, I know. Let’s break it down.</p><p>Let’s start with the <code>Recovery Methods</code>. These do exactly what you’d expect: help to recover your accounts or set them up for the first time on a new device. There are a lot of potential ways to design recovery methods, but let’s focus on the two standards-based approaches most commonly supported by <code>Wallet Clients</code> today:</p><ul><li><p><strong>Private Keys:</strong> As we saw above, every account has both a private key and a public key. If you have an account&apos;s private key, you can always use it to recover the public key and account address. It’s created from a combination of randomness and cryptographic math. Strong arguments can be made that private keys should never be user facing.</p></li><li><p><strong>Recovery Phrases (aka Seed Phrases/Mnemonic Phrases):</strong> These are the 12 or 24 word phrases (defined by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">BIP-39</a>) that you are encouraged to back up safely &amp; securely. Their original intention was to be a human readable way to produce the randomness required to generate a private key. They are less prone to transcription errors than a base-58 string, easier to speak aloud (see: accessibility), and possibly (though it’s a stretch for most) even memorized.</p></li></ul><p>These recovery methods are incredibly powerful! They help your <code>Wallet Client</code> consistently <strong>derive</strong> what we’ll call the <code>Wallet Structure</code>: the list of all your accounts and the private keys that control them.</p><p>&quot;Wait—what do you mean ‘derive’? Why don&apos;t you just say ‘create’?&quot;</p><p>Because—brace yourself—every possible account in any blockchain address space <em>already</em> <em>exists</em> 🤯. Check out Dmitri Cherniak&apos;s <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://deadringers.dmitricherniak.com/">Dead Ringers</a> for a visually sumptuous example of this in action. So, we say derived because your <code>Recovery Phrase</code> is used to <em>discover</em> a specific public/private keypair that controls an account.</p><p>“But wait… how do you avoid two people getting access to the same account?”</p><p>Incomprehensibly large numbers of things. There are so many possible accounts that, even though we’re deriving keypairs for them randomly, the odds of generating the same one twice are infinitesimally small. You have a better chance of hitting the moon by throwing a rock. But a well designed <code>Recovery Method</code> lets you derive the account <strong>deterministically</strong>.</p><p>“Wait—can you clarify what you mean by ‘deterministically’? Just so I’m sure.”</p><p>We say it is deterministic because the same <code>Recovery Method</code> will derive the same keypairs 100% of the time. Almost all <code>Wallet Clients</code> achieve this through the magic of Hierarchical Deterministic Wallets (HD wallet)—the most common <code>Wallet Structure</code>.</p><p>&quot;OMG, yet another thing called a wallet!?&quot; Yes.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a654ae1757d94dde1f2395f29cf1419b06330e34b2bf4acf88857f15a62607c0.png" alt="Please, keep saying wallet. All words should be wallet." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Please, keep saying wallet. All words should be wallet.</figcaption></figure><h3 id="h-what-is-an-hd-wallet" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What Is An HD Wallet?</h3><p>It&apos;s a tree of accounts derived from a single root keypair, and originated in the Bitcoin world as <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki">BIP-32</a>.</p><p>An HD Wallet is a pretty interesting construct because, using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki">BIP-44</a>, a <code>Wallet Client</code> can walk what&apos;s called a derivation path and “discover” all the accounts that have associated on-chain activity—magic! This aspect of an HD wallet&apos;s tree of accounts is pretty under-explored. Most wallet clients support just a single account, or a single layer of accounts. But technically you can have children accounts, and grand children accounts, and so on. There’s no limit to the number of levels!</p><p>Now, I’m but a simple designer. There are many reasons to be cautious about how HD Wallets are used, and how many accounts and child accounts you tie to a single recovery method; as they say, don’t put all your eggs in one basket. But, it seems worth investigating them more deeply as a means of addressing at least part of the account composition problem. Not everybody has the same threat model.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/db8e8cffdaa0fe706819b84d63144dffbf74b17f55e3d88d82e85c8f00a41040.png" alt="Child accounts, literally!" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Child accounts, literally!</figcaption></figure><h3 id="h-challenges-that-current-recovery-methods-face" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Challenges That Current Recovery Methods Face</h3><ul><li><p><strong>Diverse Threat Models:</strong> Even software professionals are not security experts. It’s hard for most people to know exactly how much time and energy they should put into securing their assets—a problem that is not unique to blockchains—and what sort of practices they should routinely engage in to monitor and respond to changing circumstances. This practice is called threat modelling. There’s a lot of room for building tools and practices that help increase awareness and default people into the practices that best fit their current threat model.</p></li><li><p><strong>Accessibility:</strong> Though recovery phrases push accessibility forward a bit, the BIP-39 spec explicitly states “it is <strong>strongly discouraged</strong> to use non-English wordlists.” The vast majority of people on Earth speak no English. So many things in this space carry with them the baggage of the programming languages that support them being English and ASCII prime.</p></li><li><p><strong>Fragility:</strong> You only have to make a mistake with your recovery mechanism once, and then it is compromised—or lost! You may not even realize you’ve compromised or lost your recovery method until it’s too late. It’s hard to strike the right balance between ensuring a Recovery Method is at hand when you need it, but that also secured against theft. Vitalik has written a great introduction to the importance of Social Recovery as an alternative approach moving forward:</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vitalik.ca/general/2021/01/11/recovery.html">https://vitalik.ca/general/2021/01/11/recovery.html</a></p></li></ul><h2 id="h-wallet-out" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Wallet Out</h2><p>So, I hope you&apos;ve got a clearer model of how the pieces of the <strong>Wallet Stack</strong> weave together. And the next 10 times you feel the word “wallet” on the tip of your tongue, I hope you momentarily pause to check that you’re using the most precise term you can.</p><p>I hope that, in the next Coinbase Wallet sprint, someone asks “Alex, can you fix the bug with <code>accounts</code> being derived non-deterministically in the <code>wallet structure</code> when users input their <code>recovery method</code> in the latest version of our <code>wallet client</code>?” It’ll take some practice, but over time it’ll pay dividends for us, our collaborators, and the ecosystem as a whole.</p><p>Is there any single piece of the <strong>Wallet Stack</strong> that we can simply call a “wallet”, though? In Glen Weyl, Puja Ohlhaver and Vitalik Buterin’s latest white paper “<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4105763">Decentralized Society: Finding Web3’s Soul</a>”, they opt to use wallet as a synonym for account (emphasis mine).</p><blockquote><p>We begin by explaining the primitives of DeSoc, centered around <strong>accounts (or wallets)</strong> holding non-transferable (initially public) “soulbound” tokens (SBTs) representing commitments, credentials, and affiliations. Such tokens would be like an extended resume, issued by other wallets that attest to these social relations.</p></blockquote><p>I’ll save my quibbles with the word “soul” for a separate post, but as goes Vitalik’s steady thought leadership, so goes much of the community. I suspect the wallet/account terminological collapse is where we’re headed. And that is fine, as long as we aim for consistency and clarity—both in our discussions about what to build, and the UI copy our wallet clients expose.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/95f406265d77309236cd72a9158fe623805f012d0d2b64cbf56683b3f95860d1.png" alt="The revised Wallet Stack diagram." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">The revised Wallet Stack diagram.</figcaption></figure><p>Great challenges and opportunities lay ahead for the <strong>Wallet Stack</strong> in a multi-chain world! My only wish is that we pursue them with common terms.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/717ecd85156e163c1b5d9e8874e3ee8bf4f5f4f1195ad189983d6f8efc7b5cdd.gif" alt="I welcome feedback." blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">I welcome feedback.</figcaption></figure><p>I’m currently working on UX patterns for local-first edge application development at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://fission.codes">fission.codes</a>. I’m in the midst of putting together a chain-agnostic account metadata standard proposal. If you’d like to talk about any of this, you can find me on Twitter, and everywhere else, as <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/depatchedmode">@depatchedmode</a>.</p>]]></content:encoded>
            <author>depatchedmode-2@newsletter.paragraph.com (depatchedmode)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/856c59e7de41a6b786bc6a28747c55dd8bd7ed3a6ac88cd4a43cc211ac07d17d.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>