<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>truegav</title>
		<link>/</link>
		<description>Recent content on truegav</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Fri, 05 Jun 2026 18:00:00 +0530</lastBuildDate>
		
			<atom:link href="/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>I learned six subjects in three days and passed, what is your fucking excuse</title>
				<link>/posts/six-subjects-three-days-passed/</link>
				<pubDate>Fri, 05 Jun 2026 18:00:00 +0530</pubDate>
				<guid>/posts/six-subjects-three-days-passed/</guid>
				<description>&lt;h2 id=&#34;the-crime&#34;&gt;The crime&lt;/h2&gt;&#xA;&lt;p&gt;Thirty hours. Three days. Six subjects. Target: forty out of fifty on a makeup exam for Advanced Numerical Methods. I did not attend most of the lectures. I did not complete most of the assigned homework. I did not open the recommended textbook until seventy-two hours before the examination.&lt;/p&gt;&#xA;&lt;p&gt;The students who attended every lecture, completed every assignment, and participated in every tutorial scored lower than I did.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A god that wants nothing is the most terrifying thing I can imagine</title>
				<link>/posts/god-that-wants-nothing/</link>
				<pubDate>Tue, 12 May 2026 14:00:00 +0530</pubDate>
				<guid>/posts/god-that-wants-nothing/</guid>
				<description>&lt;h2 id=&#34;the-ocean-that-has-no-preferences&#34;&gt;The ocean that has no preferences&lt;/h2&gt;&#xA;&lt;p&gt;Exurb1a released a 35-minute video in 2026 called &amp;ldquo;maybe I&amp;rsquo;m the alien.&amp;rdquo; A xenosychologist crashes on an ocean planet. The ocean is a single continuous consciousness spanning the entire surface. A mind without a self. Without desire. Without anything that could be called an internal state.&lt;/p&gt;&#xA;&lt;p&gt;It reflects everything perfectly because there is nothing inside it to interfere with the reflection. It does not help. It does not hurt. The ocean is not malevolent or benevolent or indifferent because each of these requires a capacity to form preferences and the ocean does not form preferences. It has never formed anything. It simply mirrors whatever approaches it and nothing it mirrors changes anything about the ocean.&lt;/p&gt;</description>
			</item>
			<item>
				<title>AI slop is drowning bug bounty and nobody in charge gives a single fuck</title>
				<link>/posts/ai-slop-drowning-bug-bounty/</link>
				<pubDate>Sun, 10 May 2026 14:00:00 +0530</pubDate>
				<guid>/posts/ai-slop-drowning-bug-bounty/</guid>
				<description>&lt;h2 id=&#34;the-funeral-that-nobody-scheduled&#34;&gt;The funeral that nobody scheduled&lt;/h2&gt;&#xA;&lt;p&gt;Bug bounty is dead. The industry has not scheduled the funeral because scheduling a funeral requires admitting a death occurred and admitting a death occurred is bad for the quarterly investor update.&lt;/p&gt;&#xA;&lt;p&gt;A researcher I work with delivered the autopsy in a single Discord message. Not a whitepaper. Not a 200-page industry analysis with infographics and a foreword from a partner who has never read a bug report. One sentence from someone who reads submissions every day:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Prediction markets are not magic and I can prove it with a fucking horse</title>
				<link>/posts/prediction-markets-fucking-horse/</link>
				<pubDate>Mon, 20 Apr 2026 14:00:00 +0530</pubDate>
				<guid>/posts/prediction-markets-fucking-horse/</guid>
				<description>&lt;h2 id=&#34;the-drawer&#34;&gt;The drawer&lt;/h2&gt;&#xA;&lt;p&gt;A piece of paper sits inside a locked drawer with a single word written on it in pen. Nobody on earth knows the word. A prediction market on &amp;ldquo;what word is in the drawer&amp;rdquo; trades at 50/50 for every possible answer. The market is permanently and completely wrong.&lt;/p&gt;&#xA;&lt;p&gt;Someone could pay a hundred dollars to break into the house, pick the lock on the drawer, read the paper, and trade on the information. If the market holds enough volume to make the hundred-dollar break-in economics profitable, someone does this and the price collapses to 99/1 on the correct word. If the market is too small, nobody breaks in. The cost of discovering the truth exceeds the profit available from trading on it. The market stays at 50/50 while the correct answer sits twelve inches away inside a piece of particle board furniture.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Terraforming is colonialist trash, modify your own body like a real pioneer</title>
				<link>/posts/terraforming-is-colonialist-trash/</link>
				<pubDate>Thu, 15 Jan 2026 14:00:00 +0530</pubDate>
				<guid>/posts/terraforming-is-colonialist-trash/</guid>
				<description>&lt;h2 id=&#34;1942&#34;&gt;1942&lt;/h2&gt;&#xA;&lt;p&gt;Two words were coined in 1942. Terraforming: redesign the planet until humans can survive on it. Pantropy: redesign the humans until they can survive on the planet.&lt;/p&gt;&#xA;&lt;p&gt;Terraforming got every movie. Every novel. Every video game. Every Elon Musk tweet about atmospheric engineering. Pantropy got filed in a drawer labeled &amp;ldquo;body horror&amp;rdquo; where it has been sitting since the Eisenhower administration.&lt;/p&gt;&#xA;&lt;p&gt;Terraforming melts ice caps. Builds atmospheres. Generates magnetic fields. Centuries of planetary engineering that may not be physically possible in this solar system regardless of budget. Pantropy edits genes. Augments with cybernetics. Transfers consciousness into purpose-built bodies. Works anywhere. Starts immediately. Requires admitting that the human body is not the optimal configuration of matter for any environment outside the one it happened to evolve in.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Monero has better privacy than any coin you use and you do not care</title>
				<link>/posts/monero-better-privacy-nobody-cares/</link>
				<pubDate>Sat, 30 Aug 2025 14:00:00 +0530</pubDate>
				<guid>/posts/monero-better-privacy-nobody-cares/</guid>
				<description>&lt;h2 id=&#34;the-cathedral-and-the-cardboard-box&#34;&gt;The cathedral and the cardboard box&lt;/h2&gt;&#xA;&lt;p&gt;The best privacy technology in cryptocurrency has been running in production for ten years. Every transaction is private by default. Sender hidden. Receiver hidden. Amount hidden. The engineering is meticulous. The cryptography has survived every audit and every upgrade without a single known privacy break.&lt;/p&gt;&#xA;&lt;p&gt;Nobody uses it.&lt;/p&gt;&#xA;&lt;p&gt;The market prefers Tether, which broadcasts every transaction onto a permanent public ledger and can freeze any address through a single administrative ICANN-style phone call. Tether operates a customer support hotline and maintains 115 billion dollars in circulation. Monero operates a whitepaper and a development community of cryptographers who would lose a marketing contest to a sandwich board outside a hardware store. The cardboard box with a toll-free number printed on the side is overflowing with customers. The cathedral is empty.&lt;/p&gt;</description>
			</item>
			<item>
				<title>I built a bot that judges my work and it is usually more correct than I am</title>
				<link>/posts/i-built-a-bot-that-judges-my-work/</link>
				<pubDate>Mon, 12 May 2025 14:00:00 +0530</pubDate>
				<guid>/posts/i-built-a-bot-that-judges-my-work/</guid>
				<description>&lt;h2 id=&#34;the-jury-of-seven&#34;&gt;The jury of seven&lt;/h2&gt;&#xA;&lt;p&gt;I built a triage bot for a major security platform. Seven agents arranged in a pipeline. Repo scope identification, finding scope extraction, function verification, proof-of-concept validation, economic feasibility analysis, and final severity classification. It reads incoming bug bounty submissions and judges the professional output of security researchers who have spent longer in this industry than I have been alive.&lt;/p&gt;&#xA;&lt;p&gt;It was designed to reduce my daily triage workload. It has instead become the most surgically condescending entity I have ever interacted with.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Your audit cost more than my entire net worth and you still got hacked, lmao</title>
				<link>/posts/audit-cost-more-than-my-net-worth/</link>
				<pubDate>Tue, 18 Feb 2025 14:00:00 +0530</pubDate>
				<guid>/posts/audit-cost-more-than-my-net-worth/</guid>
				<description>&lt;h2 id=&#34;the-three-stamps&#34;&gt;The three stamps&lt;/h2&gt;&#xA;&lt;p&gt;Balancer V2 hired Trail of Bits. Then OpenZeppelin. Then Certora. These are the names you print on your pitch deck in 24-point bold to make the venture capital partner stop asking about security and start focusing on the token allocation table.&lt;/p&gt;&#xA;&lt;p&gt;Months of review. Hundreds of thousands of dollars in fees. Multiple remediation rounds. Multiple re-review rounds. Three firms whose combined brand reputation could convince a regulated bank to integrate a smart contract.&lt;/p&gt;</description>
			</item>
			<item>
				<title>ecrecover has been lying for eight years and your code still trusts it</title>
				<link>/posts/ecrecover-has-been-lying-for-eight-years/</link>
				<pubDate>Fri, 05 Jul 2024 14:00:00 +0530</pubDate>
				<guid>/posts/ecrecover-has-been-lying-for-eight-years/</guid>
				<description>&lt;h2 id=&#34;the-liar-at-address-0x01&#34;&gt;The liar at address 0x01&lt;/h2&gt;&#xA;&lt;p&gt;There is a function baked into the EVM protocol at &lt;code&gt;0x01&lt;/code&gt; that has been deceiving developers since the Frontier release in 2015. Not a smart contract bug. Not a compiler issue. A precompile. Hardcoded into every Ethereum node. When ECDSA public key recovery succeeds, it returns the signer&amp;rsquo;s address. When recovery fails, it returns &lt;code&gt;address(0)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Zero. The null address. Delivered with the emotional affect of a cinder block. No revert. No event. No error state. Just zero.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Every single signature you have ever verified has a twin</title>
				<link>/posts/every-signature-has-a-twin/</link>
				<pubDate>Wed, 10 Apr 2024 14:00:00 +0530</pubDate>
				<guid>/posts/every-signature-has-a-twin/</guid>
				<description>&lt;h2 id=&#34;the-sibling&#34;&gt;The sibling&lt;/h2&gt;&#xA;&lt;p&gt;Every ECDSA signature &lt;code&gt;(r, s, v)&lt;/code&gt; possesses an identical twin &lt;code&gt;(r, n - s, v XOR 1)&lt;/code&gt;. Same private key signed both. Same message was hashed. &lt;code&gt;ecrecover&lt;/code&gt; returns the identical address for both. Your protocol processes them as distinct authorizations because the raw bytes differ.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;original_sig&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;s2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SECP256K1_ORDER&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;^&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# (r, s2, v2) recovers to the same address&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The secp256k1 curve is symmetric. For every valid point &lt;code&gt;(x, y)&lt;/code&gt; that exists on the curve, &lt;code&gt;(x, -y)&lt;/code&gt; also exists. The &lt;code&gt;s&lt;/code&gt; component of the signature encodes which y-coordinate was selected during the signing process. Flip &lt;code&gt;s&lt;/code&gt; modulo the curve order and flip the parity bit in &lt;code&gt;v&lt;/code&gt;. You have now manufactured a second, completely valid, cryptographically indistinguishable signature for the identical message from the identical key. You never touched the private key. You performed modular arithmetic that a motivated fourteen year old could execute.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Aztec has seven keys and a proving system called Honk and I fucking love it</title>
				<link>/posts/aztec-seven-keys-honk/</link>
				<pubDate>Fri, 22 Mar 2024 14:00:00 +0530</pubDate>
				<guid>/posts/aztec-seven-keys-honk/</guid>
				<description>&lt;h2 id=&#34;two-keys-is-a-childs-toy&#34;&gt;Two keys is a childs toy&lt;/h2&gt;&#xA;&lt;p&gt;Monero solved privacy with two keys. A spend key and a view key. Two keys. One job per key. Ten years of flawless operation. The Monero cryptographers identified the minimum viable cryptographic primitives and deployed them. This approach is admirable. It is also the cryptographic equivalent of furnishing your apartment with exactly two items from IKEA.&lt;/p&gt;&#xA;&lt;p&gt;Aztec examined the same problem space and concluded that two keys constituted a personal insult to the concept of key derivation.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A 1982 paper broke knapsack crypto and nobody noticed for a fucking decade</title>
				<link>/posts/1982-paper-broke-knapsack/</link>
				<pubDate>Mon, 22 Jan 2024 14:00:00 +0530</pubDate>
				<guid>/posts/1982-paper-broke-knapsack/</guid>
				<description>&lt;h2 id=&#34;the-gift-that-keeps-on-killing&#34;&gt;The gift that keeps on killing&lt;/h2&gt;&#xA;&lt;p&gt;A 1982 paper about the geometry of numbers has killed more cryptosystems than every signals intelligence agency on the planet combined. Three Dutch mathematicians published it, collected their citations, and went home. They had no idea they had just handed the world a weapon that would still be executing cryptosystems forty years later while they enjoyed retirement.&lt;/p&gt;&#xA;&lt;p&gt;The algorithm finds short vectors in polynomial time.&lt;/p&gt;</description>
			</item>
			<item>
				<title>You put msg.value in a loop and lost money, what did you expect</title>
				<link>/posts/msgvalue-in-loop-lost-money/</link>
				<pubDate>Thu, 28 Sep 2023 14:00:00 +0530</pubDate>
				<guid>/posts/msgvalue-in-loop-lost-money/</guid>
				<description>&lt;h2 id=&#34;the-variable-that-never-moves&#34;&gt;The variable that never moves&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;msg.value&lt;/code&gt; does not change inside a loop. That sentence has cost the crypto industry more than a hundred million dollars and it will cost more because the sentence is technically correct and the mental model of every developer who writes a loop is technically wrong and the EVM has no mechanism for caring about the distance between the two.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;msg.value&lt;/code&gt; is established once at the start of a transaction. It holds the total ether attached. It persists unchanged through every internal call, every delegatecall, and every iteration of every loop in the entire call tree. It never decreases. It never subdivides. It holds one number from the first instruction to the last.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Your inheritance chain is a crime scene and you are the suspect</title>
				<link>/posts/inheritance-chain-crime-scene/</link>
				<pubDate>Thu, 15 Jun 2023 14:00:00 +0530</pubDate>
				<guid>/posts/inheritance-chain-crime-scene/</guid>
				<description>&lt;h2 id=&#34;the-quiz&#34;&gt;The quiz&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;contract&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;virtual&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;pure&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;returns&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;contract&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;B&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;virtual&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;pure&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;returns&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;contract&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;C&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;virtual&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;pure&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;returns&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;contract&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;D&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;C&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;override&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;pure&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;returns&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What does &lt;code&gt;D.foo()&lt;/code&gt; return?&lt;/p&gt;&#xA;&lt;p&gt;If you said B, your diamond inheritance contains a bug and you do not know it. If you said C, you either understand C3 linearization or you guessed and your luck will expire on the next diamond you deploy. If you said some variation of &amp;ldquo;I have no idea,&amp;rdquo; congratulations on being honest. You are in the majority. The majority is where protocols get drained.&lt;/p&gt;</description>
			</item>
			<item>
				<title>OpenZeppelin fixed this five years ago and your code still has it, why</title>
				<link>/posts/openzeppelin-fixed-this-five-years-ago/</link>
				<pubDate>Wed, 18 May 2022 14:00:00 +0530</pubDate>
				<guid>/posts/openzeppelin-fixed-this-five-years-ago/</guid>
				<description>&lt;h2 id=&#34;two-functions&#34;&gt;Two functions&lt;/h2&gt;&#xA;&lt;p&gt;Solidity provides two encoding functions for preparing data before hashing. &lt;code&gt;abi.encode&lt;/code&gt; pads every argument to a full 32 bytes with zero-fill. &lt;code&gt;abi.encodePacked&lt;/code&gt; concatenates raw bytes with nothing separating adjacent arguments.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;abi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;encodePacked&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0xdead&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0xbeef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;abi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;encodePacked&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0xdead000000000000000000000000000000000000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0xbeef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These two calls produce identical byte output. An address with trailing zero bytes next to a small uint packs into the exact same bytestring as a different address next to a large uint. Hash this output and use it as a signature commitment. An attacker can forge equivalent messages by shifting the type boundary between the arguments because the padding that differentiates them does not exist.&lt;/p&gt;</description>
			</item>
			<item>
				<title>I found your extcodesize bug, I am better than your auditor, and I am tired</title>
				<link>/posts/extcodesize-better-than-your-auditor/</link>
				<pubDate>Thu, 10 Feb 2022 14:00:00 +0530</pubDate>
				<guid>/posts/extcodesize-better-than-your-auditor/</guid>
				<description>&lt;h2 id=&#34;the-liar-embedded-in-the-protocol&#34;&gt;The liar embedded in the protocol&lt;/h2&gt;&#xA;&lt;p&gt;extcodesize has been lying to Solidity developers since the Ethereum genesis block. Every developer discovers this lie during an active exploit. Never during development. Never during the audit. Never during code review. Always during a production incident while funds are exiting the protocol.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;isContract&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;view&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;returns&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function is inside your deployed bytecode. It compiles without warnings. It passes every test you wrote. It is catastrophically wrong during the only moment in its operational lifetime when correctness matters.&lt;/p&gt;</description>
			</item>
			<item>
				<title>47 dead projects and the exact moment each one died, fuck you</title>
				<link>/posts/47-dead-projects/</link>
				<pubDate>Mon, 01 Nov 2021 14:00:00 +0530</pubDate>
				<guid>/posts/47-dead-projects/</guid>
				<description>&lt;h2 id=&#34;the-graveyard&#34;&gt;The graveyard&lt;/h2&gt;&#xA;&lt;p&gt;I have 47 unfinished projects. I counted them last night instead of finishing any of them. The counting process nearly became project 48. I caught myself opening a new repository at 2 AM and had to physically close the laptop.&lt;/p&gt;&#xA;&lt;p&gt;This is an autopsy report. I will walk you through every corpse. Some are still warm. Some have been decomposing since before COVID. All of them died at a specific, identifiable moment. I will show you the moment.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Six years after the DAO and you still write this bug, fucking embarrassing</title>
				<link>/posts/reentrancy-six-years-after-dao/</link>
				<pubDate>Sun, 20 Jun 2021 14:00:00 +0530</pubDate>
				<guid>/posts/reentrancy-six-years-after-dao/</guid>
				<description>&lt;h2 id=&#34;the-beetle-that-will-outlive-you&#34;&gt;The beetle that will outlive you&lt;/h2&gt;&#xA;&lt;p&gt;The DAO was drained for sixty million dollars on June 17, 2016. I have reviewed twelve contracts in the last six months. Every single one contained the exact same reentrancy bug. All twelve were audited. Some by firms whose LinkedIn profiles you might recognize.&lt;/p&gt;&#xA;&lt;p&gt;If a bug could win a Darwin Award for persistence, this bug would have a trophy case the size of a warehouse. It has survived every EIP. Every hard fork. Every static analysis tool. Every blog post titled &amp;ldquo;How to Prevent Reentrancy Once and For All.&amp;rdquo; It is the roach of the EVM. It was here before you learned Solidity and it will be here after you retire.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Delegatecall is a war crime and I keep committing it</title>
				<link>/posts/delegatecall-war-crime/</link>
				<pubDate>Mon, 15 Mar 2021 14:00:00 +0530</pubDate>
				<guid>/posts/delegatecall-war-crime/</guid>
				<description>&lt;h2 id=&#34;three-opcodes-and-two-want-you-dead&#34;&gt;Three opcodes and two want you dead&lt;/h2&gt;&#xA;&lt;p&gt;The EVM provides three ways to invoke another contract.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;call&lt;/code&gt; sends ETH and returns data. Civilized. Predictable. What a normal engineer would design.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;staticcall&lt;/code&gt; is read-only and cannot modify state. Has never caused anyone harm.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;delegatecall&lt;/code&gt; runs the target&amp;rsquo;s bytecode inside your storage context. Your balance becomes their balance. Your identity becomes their identity. The target code reads your variables and writes to your slots using its own names. The EVM sits in the corner and allows this because the EVM was designed by people who considered this an acceptable tradeoff between code reuse and safety.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
