<?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>Devan Non</title>
        <link>https://paragraph.com/@devanon</link>
        <description>Just an Anon Dev doing some MEV stuff on this thing called the EVM

https://twitter.com/devanoneth</description>
        <lastBuildDate>Thu, 23 Apr 2026 10:48:48 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Devan Non</title>
            <url>https://storage.googleapis.com/papyrus_images/84f6f3ca0946523a6e775f4e8105a093845b68cc9f9368f15150ca0b070ebd1a.jpg</url>
            <link>https://paragraph.com/@devanon</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[A modern self-custody setup for Ethereum]]></title>
            <link>https://paragraph.com/@devanon/a-modern-self-custody-setup-for-ethereum</link>
            <guid>iZEgvZ9zpgm4LGeGOsAx</guid>
            <pubDate>Wed, 11 Jan 2023 16:01:59 GMT</pubDate>
            <description><![CDATA[Safe. That’s what you want your cute JPEGs and dog coins to be. Safe so you can sleep soundly at night. If you had some jewellery that you wanted to keep safe, you’d put your items in a… safe, you got it! So, it shouldn’t come as a surprise that the key to keeping your digital items safe, is to also use a Safe. Well, a digital one. Let me explain.A Digital SafeI’ve built custody infrastructure for a large crypto custodian that to this day has not been hacked. We used Shamir’s Secret Sharing, ...]]></description>
            <content:encoded><![CDATA[<p>Safe. That’s what you want your cute JPEGs and dog coins to be. Safe so you can sleep soundly at night.</p><p>If you had some jewellery that you wanted to keep safe, you’d put your items in a… safe, you got it! So, it shouldn’t come as a surprise that the key to keeping your digital items safe, is to also use a Safe.</p><p>Well, a digital one. Let me explain.</p><h2 id="h-a-digital-safe" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">A Digital Safe</h2><p>I’ve built custody infrastructure for a large crypto custodian that to this day has not been hacked. We used Shamir’s Secret Sharing, Hardware Security Module servers, georeplicated in highly secure data centers, multiple air-gapped laptops, lengthy key ceremonies, physical and digital key shares backed-up in multiple locations… and more. The point is, it’s a lengthy and costly process that only makes sense if you plan to custodize billions and have many potential attack vectors. That’s probably not you. If it is, this article is not for you.</p><p>If you simply want to sleep well at night and custodize thousands to early-millions, I’ve got the setup for you. In order to be able to explore everything the Ethereum ecosystem has to offer, I’ve settled on three tiers of custody, with most assets being stored on the later tiers:</p><h2 id="h-tiers-of-custody" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tiers of Custody</h2><ol><li><p><strong>I like to live life on the edge.</strong></p><p>This tier is basically for anything that you don’t mind losing. Like, completely okay with losing. You might ask why it even exists then? I would say two reasons. Firstly, sometimes you want to be a degen and a hot wallet is needed so you can quickly execute some transactions. Secondly, if you are developing a dapp, a hot wallet is much easier to use for testing. To be clear, you should move any assets you actually care about to a more secure tier of custody after your degenning.</p><p><strong>Recommendation:</strong> On desktop, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://metamask.io/">MetaMask</a> still reigns king here. It is simply the most battle tested hot wallet. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://rabby.io/">Rabby</a> gets an honorable mention due to its much nicer UX and I am personally testing this out (with a new mnemonic of course). Although it doesn’t support Firefox yet which is very annoying. On mobile, I’ve been enjoying <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://rainbow.me/">Rainbow</a> due to its UX and security. It uses <code>react-native-keychain</code> which means that on modern phones your private keys are encrypted with a key in a hardware security module. For most people, this is probably more secure than MetaMask or Rabby.</p></li><li><p><strong>What if there is a bug in a smart contract wallet?</strong></p><p>If you have <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.parity.io/blog/a-postmortem-on-the-parity-multi-sig-library-self-destruct/">Parity multi-sig PTSD</a>, I get it. While I think Safe maintains an admirable software-development lifecycle, there is simply just an extra layer of dependencies involved when using a smart contract wallet.</p><p>For this reason, I recommend to also just have some assets stored on a highly-reliable hardware wallet. This could also be used in cases where a website doesn’t support smart contract wallets.</p><p><strong>Recommendation:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ledger.com/">Ledger</a> with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://frame.sh/">Frame</a>. While Ledger customer data has been compromised in the past, I think the hardware security and UX they offer is best-in-class. If you want to avoid being in their customer database, I have a tip. Provided you can attend a conference, Ledger often has a booth where they sell Ledgers. Or, you could buy one from a well-known reseller. Or, you could use a PO box and crypto directly on Ledger’s website. It’s important to know of ways to avoid providing personally-identifiable information.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/joshie_sh">@joshie_sh</a> reviewed this article (much love) and recommends <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://trezor.io">Trezor</a>, especially for their well implemented <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://trezor.io/learn/a/passphrases-and-hidden-wallets">passphrase and hidden wallet features</a>. There are many debates online between Ledger and Trezor. The reality is, the hardware of choice is probably not going to be the weakest link in your custody setup and so going with either is fine today.</p></li><li><p><strong>Wow, who knew smart contract wallets were so powerful?</strong></p><p>Me, I knew! And, so will you shortly. See, with a smart contract wallet we can combine the security and convenience of all of the above tiers. Imagine your computer gets hacked and your MetaMask keys get stolen. Now, imagine simultaneously your phone gets hacked and your Rainbow keys get stolen. And, wow, what a hacker they are, they also managed to find a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Zero-day_(computing)">zero-day</a> on Ledger. Quite hard to imagine all of those happening together, right?</p><p>Smart contract wallets allow us to have multiple <em>signers</em> and a <em>threshold</em>. These signers are simply other wallets. The threshold is the amount of signers that need to agree on a transaction. I recommend setting up a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://safe.global/">Safe</a> with three signers and a threshold of two:</p><ol><li><p>MetaMask / Rabby</p></li><li><p>Rainbow</p></li><li><p>Ledger</p></li></ol><p>Two of these would need to be simultaneously hacked in order to get your assets from a Safe. As you can see, this is already much more secure than having your assets in a single wallet. However, you may find it annoying that you need to always sign with two wallets. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.gnosis-safe.io/en/articles/4667979-set-up-and-use-spending-limits">Spending limits</a> can come to the rescue here. You can allow one signer to spend a certain amount of a certain token in a defined period. Personally, I have given my Rainbow wallet a small allowance to spend daily from my Safe and this works really well.</p></li></ol><p>Between tiers 2 and 3, I actually don’t think it’s possible to say one is simply <em>safer</em> than the other. Instead, they have different attack vectors and risks. This brings me to my biggest point:</p><blockquote><p>Diversify your assets, anon. You want to diversify all possible attack vectors while minimizing the effort of accessing your funds.</p></blockquote><h2 id="h-mnemonic-chaos" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Mnemonic Chaos</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a1828f29b0874791fff8bed557bf1ff57a993b4156ace32d25ccb1e5b37aa6d7.png" alt="Actual picture of a Web3 user wondering what to do with all of those words" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Actual picture of a Web3 user wondering what to do with all of those words</figcaption></figure><p>If you’ve followed my setup, you now have at least three mnemonic phrases to worry about. This can be pretty annoying, but it doesn’t have to be. I’m not going to go into too much detail on how to protect these, rather I will write another article that goes into detail on this. With that said, here is the <strong>TL;DR</strong> of what I recommend which you should be able to follow if you are an advanced user and cannot wait for my next article:</p><ul><li><p>Multiple USB drives in different locations</p></li><li><p>Two Veracrypt partitions with different keys (VeraCrypt hidden volume) on these USB drives</p></li><li><p>MetaMask key in the first partition which can be given in distress situations</p></li><li><p>Rainbow and Ledger keys in the hidden volume which should never be given up</p></li><li><p>All setup with an airgapped-laptop</p></li></ul><h2 id="h-caveats" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Caveats</h2><ol><li><p><strong>OMFG, why doesn’t this website support smart contract wallets?</strong></p><p>I’m looking at you OpenSea. But you’re not alone on this. Lens Protocol (of which I am a big fan) currently has minimal support for smart contract wallets but I think that will change soon.</p><p>With that said, you should look for alternative dapps which do support smart contract wallets. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://castle.link/">Castle</a> is building a NFT Marketplace with first party support for smart contract wallets for example. Otherwise, in these cases, your MetaMask or Ledger can come in handy here.</p></li><li><p><strong>Safe on other chains</strong></p><p>Be careful when providing your Safe address to others. This address is only valid on the chain you deployed it on. It is possible to get the same address on other chains, but it’s quite an involved process.</p></li><li><p><strong>Death</strong></p><p>In this scenario, you don’t want your family to miss out on your hard earned dog coins, right? This will be tackled in my next article.</p></li></ol><h3 id="h-disclaimer" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Disclaimer</h3><p>I am a Safe Guardian which means I’ve been awarded some $SAFE tokens. With that said, I’ve been a big proponent of Safe for a long time and have personally used it long before a token was even considered. It’s just simply the best smart contract wallet that exists today.</p>]]></content:encoded>
            <author>devanon@newsletter.paragraph.com (Devan Non)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/146fdd5e8019784ec055fd2ed229fc3727719985c65d5158c473ac344cd40cd5.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Solidity Coverage in VS Code with Foundry]]></title>
            <link>https://paragraph.com/@devanon/solidity-coverage-in-vs-code-with-foundry</link>
            <guid>3rvAeuQHeEEjIminSdve</guid>
            <pubDate>Mon, 27 Jun 2022 13:52:46 GMT</pubDate>
            <description><![CDATA[Yeah, I know you’ve probably heard about the hype by now. People are flocking to Foundry and there’s nothing you can do about it. So, strap in, there’s been a new release which brings coverage reporting!Install / Upgrade FoundryFirst, make sure you’re on the latest version of Foundry. If you don’t have it, get it here. If you do have it installed already, get the latest version by running:$ foundryup View CoverageTo get a coverage report, it all starts with:$ forge coverage By default this wi...]]></description>
            <content:encoded><![CDATA[<figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e80483ff195d55d7463f560833a14f3c54119273c35a96f6e0fb0aad3d8be8eb.png" 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>Yeah, I know you’ve probably heard about the hype by now. People are flocking to Foundry and there’s nothing you can do about it. So, strap in, there’s been a new release which brings coverage reporting!</p><h2 id="h-install-upgrade-foundry" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Install / Upgrade Foundry</h2><p>First, make sure you’re on the latest version of Foundry. If you don’t have it, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://getfoundry.sh/">get it here</a>.</p><p>If you do have it installed already, get the latest version by running:</p><pre data-type="codeBlock" text="$ foundryup
"><code><span class="hljs-variable">$ </span>foundryup
</code></pre><h2 id="h-view-coverage" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">View Coverage</h2><p>To get a coverage report, it all starts with:</p><pre data-type="codeBlock" text="$ forge coverage
"><code><span class="hljs-variable">$ </span>forge coverage
</code></pre><p>By default this will display a summary, which will look like this:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1df1d0d0d5cec4ed638dfac22a0bc2034cefc36d7f4025e5610cc75fadb3a4bc.png" 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>It’s already quite nice, but you can change the output via the <code>--report</code> flag. In order to get the coverage displayed nicely in VS Code, we need to use the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/linux-test-project/lcov">LCOV</a> reporter. So, run:</p><pre data-type="codeBlock" text="$ forge coverage --report lcov
"><code>$ forge coverage <span class="hljs-operator">-</span><span class="hljs-operator">-</span>report lcov
</code></pre><p>You should now have a <code>lcov.info</code> file in your project directory. LCOV files can be parsed by many tools / extensions. In the case of VS Code I recommend <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters">Coverage Gutters</a>.</p><ol><li><p>Install the Coverage Gutters extension.</p></li><li><p>Open the file you want to see coverage results for.</p></li><li><p>Open the command palette in VS Code (CMD+SHIFT+P or CTRL+SHIFT+P by default) and type “Display Coverage”, you should see the option “Coverage Gutters: Display Coverage“, select it.</p></li><li><p>Now, your file should be nicely colored line-by-line showing if a line has been hit or not (green for hit, red for missed).</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/00de3af91fcb960fec6a581284f003801cb414faf559093dd583801125a61e30.png" 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>Obviously, there are some issues present. The constructor is definitely being hit in my tests, but it’s showing as a miss! Coverage in Foundry is still very much a work-in-progress, but it’s great that we have an initial version so we can start setting up our tooling and processes around it. Knowing the Foundry team, this feature will quickly blossom into another example of what the premier Solidity testing framework has to offer.</p><h2 id="h-example-repos" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Example Repos</h2><ul><li><p>All the examples in this repo were performed on my <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/devanonon/ERC4626Votes">ERC4626Votes repo</a>.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/onbjerg">Onbjerg</a> has a nice <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/onbjerg/forge-coverage-test">example repo which includes the Codecov GitHub action</a>. He also built the actual coverage feature, so kudos to him!</p></li></ul>]]></content:encoded>
            <author>devanon@newsletter.paragraph.com (Devan Non)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/a5c1daf9747a77289492147c27725ec8c59e87a22e253de8036c21ef81a3a8cd.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>