<?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>Operator</title>
        <link>https://paragraph.com/@cybertelx</link>
        <description>13 year old blockchain developer and free software activist.</description>
        <lastBuildDate>Sat, 11 Apr 2026 05:16:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Operator</title>
            <url>https://storage.googleapis.com/papyrus_images/45d1c27715966486fd4ff00de7e3b82a153ec092629ace0697231a70293bd400.png</url>
            <link>https://paragraph.com/@cybertelx</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[The rules of finding accurate instructions for doing something technical]]></title>
            <link>https://paragraph.com/@cybertelx/the-rules-of-finding-accurate-instructions-for-doing-something-technical</link>
            <guid>jYCAyok7U6NU8CYqCdrJ</guid>
            <pubDate>Sun, 16 Oct 2022 13:07:06 GMT</pubDate>
            <description><![CDATA[First, always check the docs (if applicable)Then search it up on a search engineIf it’s something web-y, always consult Mozilla Developer DocsNever go to W3schoolsIf it’s a programming-related question, consult StackOverflowResist the temptation to click anything in “Hot Network Questions”Never actually post your question on StackOverflowSearch it up on Reddit in the applicable subreddit (if it exists)Guides found on websites with .dev domains are always accurateGuides found on personal blogs...]]></description>
            <content:encoded><![CDATA[<ol><li><p>First, always check the docs (if applicable)</p></li><li><p>Then search it up on a search engine</p></li><li><p>If it’s something web-y, always consult Mozilla Developer Docs</p><ol><li><p>Never go to W3schools</p></li></ol></li><li><p>If it’s a programming-related question, consult StackOverflow</p><ol><li><p>Resist the temptation to click anything in “Hot Network Questions”</p></li><li><p>Never actually post your question on StackOverflow</p></li></ol></li><li><p>Search it up on Reddit in the applicable subreddit (if it exists)</p></li><li><p>Guides found on websites with .dev domains are always accurate</p></li><li><p>Guides found on personal blogs are always accurate</p></li><li><p>Guides found on the DigitalOcean blog are always accurate</p></li><li><p>Never trust GeeksForGeeks</p></li><li><p>Never trust anything written in a serif font</p></li><li><p>Never trust anything in a video</p><ol><li><p>unless it’s from Fireship</p></li></ol></li><li><p>Never trust anything on LinkedIn</p></li><li><p>After a while, give up and come back later</p></li><li><p>Never give up, stay focused</p></li><li><p>Anything on the 2nd page of Google is almost always unhelpful</p></li><li><p>Smash your computer into the wall in a fit of rage</p></li><li><p>Finally, as a last resort, ask the community of this particular solution</p><ol><li><p>and then get a link to an extremely helpful document which you couldn’t find elsewhere</p></li></ol></li></ol>]]></content:encoded>
            <author>cybertelx@newsletter.paragraph.com (Operator)</author>
        </item>
        <item>
            <title><![CDATA[Defending web3 against domain hijacking]]></title>
            <link>https://paragraph.com/@cybertelx/defending-web3-against-domain-hijacking</link>
            <guid>PkGrxVkgMudw16PaGXig</guid>
            <pubDate>Sat, 03 Sep 2022 17:11:42 GMT</pubDate>
            <description><![CDATA[TL;DR: Wallets query a domain, let’s say carpetde.fi (shameless shilling) on an on-chain registry. The carpetde.fi owner marks what smart contracts can be interacted with by this website. If the frontend interacts with something else, the wallet will give a BIG BOLD WARNING! May 14th, 2022. GoDaddy gets attacked and many DeFi protocols’ domains get domain hijacked. QuickSwap’s frontend is quickly replaced with a phishing frontend, with many users losing funds to a malicious smart contract. ht...]]></description>
            <content:encoded><![CDATA[<p>TL;DR: Wallets query a domain, let’s say <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://carpetde.fi">carpetde.fi</a> <em>(shameless shilling)</em> on an on-chain registry. The <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://carpetde.fi">carpetde.fi</a> owner marks what smart contracts can be interacted with by this website. If the frontend interacts with something else, the wallet will give a <strong>BIG BOLD WARNING!</strong></p><p><em>May 14th, 2022.</em> GoDaddy gets attacked and many DeFi protocols’ domains get domain hijacked. QuickSwap’s frontend is quickly replaced with a phishing frontend, with many users losing funds to a malicious smart contract.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/QuickswapDEX/status/1525306033400188928">https://twitter.com/QuickswapDEX/status/1525306033400188928</a></p><p>Let’s say you’re a DeFi power user, you know the ins and outs of every protocol you use. You’re pretty tech savvy and you always double-check the domain names.</p><p>One day you’re just conducting what seems to be a normal swap on your AMM of choice. Wait, where did all your USDC go? Uh oh. You check the approval transaction, and you see that you approved an attacker to take your funds. The domain just got hijacked. You feel like an idiot now, and you lost your money. :(</p><h2 id="h-domain-contracts-registry" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Domain contracts registry</h2><p>Let me explain what I mean.</p><p><strong>There’s a common security practice called the principle of least privilege where an application should only get access to what it needs and nothing more.</strong> We can apply this here, having the trusted wallet interface <strong>warn the user with big BOLD TEXT</strong> when the frontend tries to send a transaction to an address that isn’t registered as allowed for this domain and falling back to allowing all contracts if there is no registry entry.</p><p>There would be an on chain registry where domain owners can register their domain and add/remove allowed smart contracts. A domain owner would be able to prove their ownership with a TXT record on the domain pointing to their address <em>(maybe _dcr.</em><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://carpetde.fi"><em>carpetde.fi</em></a><em> shameless shill)</em>, signed with the registry’s DNSSEC key.</p><p>Each blockchain would get its own registry deployed as a Singleton at the same address using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-2470">EIP 2470</a>.</p><p>To protect against the attacker gaining control of the domain, sending a new proof of domain ownership would require a timelock of 1 month, more than enough time for the domain owner/registrar to get their shit together.</p><p>This is fully backwards compatible with all smart contracts however it requires wallets to implement it, falling back to the current insecure behavior if unimplemented.</p><h3 id="h-the-registry-should-be-flexible" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The registry should be flexible</h3><p>The registry should give enough tools for the developer to secure their dapp with fine grained policies if necessary. By default, a registered domain will use a basic implementation of a Checkpoint, which is a smart contract that has the following function selector and satisfies the implementation criteria:</p><p><code>function checkInteractionAllowed(address callTarget, bytes calldata) external view returns (bool allowed)</code></p><p>A checkpoint implementation MUST:</p><ul><li><p>Either revert or return false in <code>allowed</code> if a condition is not satisfied</p></li><li><p>Return true in <code>allowed</code> if the conditions are met</p></li></ul><p>A client implementation MUST:</p><ul><li><p>Look up the domain in the registry and find the Checkpoint address</p></li><li><p>Run the function <code>checkInteractionAllowed</code> on the Checkpoint with the target of the transaction and the transaction’s calldata</p></li><li><p>Alert the user if the function either reverts or returns false in <code>allowed</code></p></li></ul><p>A basic example of a Checkpoint would be something like this:</p><pre data-type="codeBlock" text="contract BasicCheckpoint is Ownable {
  mapping(address =&gt; bool) public isAllowed;
  
  function setAllowed(address contract, bool value) external onlyOwner {
    isAllowed[contract] = value;
  }

  function checkInteractionAllowed(address callTarget, bytes calldata) external view returns (bool allowed) {
    require(isAllowed[callTarget], &quot;Not allowed&quot;);
    return true;
  }
}
"><code><span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">BasicCheckpoint</span> <span class="hljs-keyword">is</span> <span class="hljs-title">Ownable</span> </span>{
  <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">bool</span>) <span class="hljs-keyword">public</span> isAllowed;
  
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setAllowed</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> <span class="hljs-keyword">contract</span>, <span class="hljs-keyword">bool</span> value</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title">onlyOwner</span> </span>{
    isAllowed[<span class="hljs-class"><span class="hljs-keyword">contract</span>] = <span class="hljs-title">value</span>;
  }

  <span class="hljs-title"><span class="hljs-keyword">function</span></span> <span class="hljs-title">checkInteractionAllowed</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> callTarget, <span class="hljs-keyword">bytes</span> <span class="hljs-keyword">calldata</span></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span> allowed</span>) </span>{
    <span class="hljs-built_in">require</span>(isAllowed[callTarget], <span class="hljs-string">"Not allowed"</span>);
    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
  }
}
</code></pre><p>More complex Checkpoints are possible, such as Checkpoints that check contracts to see if they are ERC-20s, Checkpoints that make sure the frontend only approves certain parties, etc etc. MIght turn this into an EIP.</p><p>I really hope that one day, DeFi becomes much much safer for the average user without sacrificing decentralization.</p><h3 id="h-image-attribution" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Image attribution</h3><p>&quot;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.flickr.com/photos/143601516@N03/29402709463">Computer Data Hacker</a>&quot; by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.flickr.com/photos/143601516@N03">Visual Content</a> is licensed under <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://creativecommons.org/licenses/by/2.0/?ref=openverse">CC BY 2.0</a>.</p>]]></content:encoded>
            <author>cybertelx@newsletter.paragraph.com (Operator)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/a502bc63f02a9c306ff32a978131d4453055e9f7a93c0fa71560cd2d4df058f3.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>