<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[awa's exploit notes]]></title><description><![CDATA[awa's exploit notes]]></description><link>https://sandaawa.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 01 Nov 2026 04:51:36 GMT</lastBuildDate><atom:link href="https://sandaawa.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Flash-loanable voting power: the one-line function behind the X100 drain]]></title><description><![CDATA[That is how X100's Freezer decided who sat on its 3-seat Senate: whoever had the most X frozen right now. No snapshot at proposal creation, no minimum…]]></description><link>https://sandaawa.hashnode.dev/flash-loanable-voting-power-the-one-line-function-behind-the-x100-drain</link><guid isPermaLink="true">https://sandaawa.hashnode.dev/flash-loanable-voting-power-the-one-line-function-behind-the-x100-drain</guid><category><![CDATA[Solidity]]></category><category><![CDATA[Security]]></category><category><![CDATA[Ethereum]]></category><dc:creator><![CDATA[awa]]></dc:creator><pubDate>Thu, 29 Oct 2026 09:08:14 GMT</pubDate><content:encoded><![CDATA[<pre><code class="language-solidity">function _stakeOf(address account) internal view override returns (uint256) {
    return frozenOf(account);
}
</code></pre>
<p>That is how X100's <code>Freezer</code> decided who sat on its 3-seat Senate: whoever had the most X frozen <em>right now</em>. No snapshot at proposal creation, no minimum freeze age.</p>
<p>On Oct 24, 2026 an attacker took an Aave flash loan of 1,942,457.64 USDT, bought 38,200 X, and had two helper contracts each freeze 19,000.000001 X and pay the 100 X candidacy fee. That bought 2 of 3 seats for the duration of one transaction, long enough to pass and execute a treasury sale.</p>
<h2>How to spot it</h2>
<ul>
<li>Find where voting weight is computed. If it calls <code>balanceOf</code>, <code>frozenOf</code>, <code>stakedOf</code> or similar <em>at vote or execute time</em>, assume a flash loan can supply it.</li>
<li>Check whether stake can be added and removed in the same block.</li>
<li>Price it: what does a seat or quorum cost at current liquidity, and what can that seat move?</li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Snapshot voting power at proposal creation (block number), or</li>
<li>require a minimum lock/freeze age before stake counts, and</li>
<li>don't let freshly elected seats vote in the block they were elected.</li>
</ul>
<p>Any one of these, or a timelock between pass and execute, would have blocked the shape used here.</p>
<hr />
<p><em>awa. Full free X100 breakdown:</em> <a href="https://paragraph.com/@sandaawa/how-x100s-senate-was-rented-for-one-transaction-a-free"><em>https://paragraph.com/@sandaawa/how-x100s-senate-was-rented-for-one-transaction-a-free</em></a><em>. Both incidents are also in a 9-page sourced PDF,</em> <a href="https://awa-exploit-breakdowns.pages.dev"><em>Exploit Breakdowns Pack 1</em></a> <em>($100 as 100 USDC on Ethereum mainnet).</em></p>
]]></content:encoded></item></channel></rss>