One millionth of a token won the X100 Senate. Then $4.85M left its only trading pool
Three wallets walked through the same open door at X100 in half an hour. We followed every coin, from the vote to the wallets that hold it today.
- $4.85M
- 0.000001 X
- 99%
- $35.68
- 2,022.86 ETH
- 2 of 3
01 · What happenedA vote won by one millionth of a coin
A stranger won a vote at X100, a new crypto project, and took $4.75 million. The winning margin was one millionth of a coin. Two more wallets used the same trick within half an hour. By then, the coin's only market was close to empty.
X100 is a new crypto token on Ethereum. Its coin is called X, and most of it sits in smart contracts, programs on the blockchain that hold coins and follow their code. In a post on X, the project said a Senate would decide how those coins are used in its market. The Senate is three seats. The three wallets that lock up the most X hold them, and any two of them can tell X100's treasury what to do with its coins.
The first attacker borrowed nearly $2 million for a few seconds and used it to buy two of those seats. Then it voted to make the treasury sell 400,000 X into a market the attacker had set up moments before. The treasury got $35.68 back. The attacker sold part of that X in the real market, paid back the loan and kept the rest.
Bitquery traced all three attacks of 24 October with its Ethereum data and the treasury's own records. Most of the money the first attacker took had arrived only minutes before, from X100's own Senate members, who were buying X. A second attacker took a smaller share and was cashing out within half an hour. The first attacker's ETH has not moved since. Two of the three seats are still held by contracts that anyone can use. And some of the first public counts were wrong, including how many wallets hold the stolen ETH.
02 · How the Senate worksLock up X, get a seat, steer the treasury
X100 keeps its treasury in a contract called the Freezer. Holders "freeze" X in it, which locks the coins for one, three or five years. Anyone who has frozen X can pay a 100 X fee to stand for the Senate.
The Senate is simply the three wallets with the most X frozen at any moment. The amount each has frozen is its stake. A seat holder can propose an action for the Freezer, such as adding its X to the market or swapping X for dollars. Two yes votes pass it. It can then run straight away, in the same transaction as the vote. A transaction is one signed instruction to the blockchain, and everything inside it happens together or not at all.
Two more details in the code made the attack cheap. A swap proposal checks only that the pool it names exists, and anyone can create a new pool in seconds. The proposal also sets its own minimum price, and all three attackers set it to zero.
There are two guards. After every proposal, the Freezer must still hold at least as much X as its users have frozen, which kept users' locked X out of reach. And the treasury may put no more than 1,000,000 X into markets, minus any X it takes back. That limit capped the damage. The attackers used every last bit of it.
03 · Launch dayThe treasury filled up the same afternoon
The Senate was brand new. Every X was created in one go a month earlier and sent to a single wallet. On the day of the attack, that wallet and one other moved 13.0 million X into the Freezer. The last big transfer landed less than an hour before the first attack. Three wallets formed the Senate that lunchtime, with 1,000 X frozen each.
On Ethereum, X trades in one place, a pool on Uniswap. A trading pool holds two coins, here X and USDT, Tether's dollar stablecoin. Traders swap one for the other, and the mix in the pool sets the price. That morning the pool held only a few thousand dollars. Within an hour of forming, the Senate had passed six proposals that added 600,000 X from the treasury to the pool, as six separate deposits.
Then the buying started. Senate members bought X with USDT and froze much of it to raise their stakes. The biggest buyer was the member wallet 0xa13a. In June it had received $5 million in USDT from a wallet our labels mark as a Bitget hot wallet. It bought three times, and its last and largest buy, at $50.83 per X, filled the pool to the highest level it ever reached.
Two minutes after 0xa13a's last buy, the first attack took nearly all the pool's dollars.
So the prize was mostly the Senate's own money. The three member wallets supplied 99% of the dollars that went into the pool that day before the attack. At the last price, the whole supply of X was worth $712 million on paper, while the pool that set that price held less than $5 million.
04 · One millionth of a coinHow a seat was won by the last digit
Seats go to the three biggest stakes, so to win two of them you have to beat the second-biggest. Just before the attack, that was the member wallet 0xe921.
The first attacker created two helper contracts and froze a hair more X in each than 0xe921 held. The gap was one millionth of an X, the smallest amount the token can count. That was enough. The helpers took seats two and three, and two seats out of three is a majority.
Within a minute, 0xa13a began freezing more X, in six transactions over ten minutes. It made no difference. One wallet holds one seat, and the other two were already gone.
Twenty-four minutes later, a second attacker played the same game, one millionth more again, and pushed the first attacker out.
Frozen X stays locked for at least a year, so the X behind those seats is stuck in the Freezer. It cost $1.94 million, and the attack covered that and left $4.75 million on top.
05 · The flash loan governance attackThe first attack, step by step
A flash loan is a loan that is borrowed and repaid inside one transaction. If the money is not back by the end, the whole transaction is cancelled, so the lender takes no risk and asks for no collateral. For a few seconds, anyone can act like a whale.
The first attack was a single transaction. It borrowed USDT from Aave, a lending app, and spent almost all of it on X. The two new helpers froze that X and took their seats. One of them proposed a swap, with the description "testnet flash governance proof". The other voted yes, and the proposal ran at once.
The proposal told the Freezer to sell 400,000 X for USDT in a PancakeSwap pool. That was all the room left under the treasury's limit after the Senate's own deposits. The attacker had made that pool earlier in the same transaction and put just $100 in it. With the minimum price at zero, the Freezer took whatever that tiny pool could pay. That was $35.68. On paper, the X it gave away was worth $20.3 million.
The attacker then pulled its X back out of its own pool and sold part of it into the real pool on Uniswap. It paid back Aave and kept $4.75 million.
The real pool held only so many dollars, so selling more X would have brought in very little. The rest of the X is still sitting in the attack contract.
06 · Two more walletsTwo more wallets, through the same door
Buyers kept coming after the first attack, and between the first and second attacks they put another $96,333 into the pool.
The second attacker, wallet 0xfc3f, took its flash loan from Morpho, another lending app. It won the two seats with its own helpers and pulled the treasury's five smaller deposits back out of the pool. Taking that X back freed room under the limit. Then it had the Freezer dump the same X into a new pool it had just made. This wallet is no beginner. It has created hundreds of contracts since March.
Its helpers never checked who was calling them. About five minutes later, a third wallet, 0xdab1, used them without freezing any X of its own. It voted with the second attacker's seats and pulled the treasury's last and largest deposit out of the pool. Then it routed that X through the pool made in the first attack, and on to itself.
Twelve seconds after that, c0ffeebabe.eth, a well-known bot that copies profitable transactions, tried the same route and found almost nothing left.
| Time (UTC) | Wallet | Seats from | What the treasury gave up | Taken |
|---|---|---|---|---|
| 14:11:47 | First attacker, 0x7ec2 | Two new helpers, flash loan from Aave | 400,000 X for $35.68 | $4.75M in USDT |
| 14:35:59 | Second attacker, 0xfc3f | Two new helpers, flash loan from Morpho | 5 pool deposits, then 50,000 X for nothing | $96,382 and 9,895 X |
| 14:40:47 | Third wallet, 0xdab1 | The second attacker's open helpers | Its last pool deposit, 550,012 X | 549,916 X and $1,909 |
| 14:40:59 | c0ffeebabe.eth | The same open helpers | Less than 36 X | Under $200 |
07 · Where the money wentETH in five wallets, and a fast exit through ChangeNOW
The thief's wallet, 0x7ec2, was new. Before the attack, its only money was a little ETH for network fees. It came six minutes earlier from FixedFloat, a swap service our labels mark as no-KYC.
Within six minutes of the attack, it swapped all of its USDT for ETH through UniswapX, where market makers compete to fill each order. Wintermute, a big market maker, filled this one. A minute later the ETH went to a fresh wallet, 0x8296, which split most of it into four new wallets of 400 ETH each and kept the rest.
None of those five wallets has sent anything since. Together they hold just over 2,022 ETH, worth about $4.75 million at the price the attacker got.
The second attacker did not wait. Its payout wallet swapped its USDT for ETH through OKX's swap router, and the ETH went through two fresh wallets to ChangeNOW, another no-KYC swap service. The whole trip took 21 minutes. ChangeNOW had also sent the attacker's main wallet ETH for fees the day before.
Someone also tried to trick that thief. Two wallets sent 0x7ec2 dust, no more than a billionth of an ETH each, from addresses that start and end like 0x8296. This is address poisoning. The hope is that the next copy and paste from the wallet's history picks the fake address.
08 · The X nobody can sellStolen coins, and nowhere to sell them
The attackers still hold about 827,000 X. They can't sell much of it, because the pool is down to under 200 X and about two dollars.
The third wallet has tried, in 95 small trades, at between fifty cents and a dollar seventy per X. Before the attack, X last traded at $50.83.
09 · Is it over?Two seats still take orders from anyone
Not yet. When we last checked, on the morning of 25 October, the Senate's three seats were 0xa13a and the second attacker's two helper contracts. Those helpers still take calls from anyone, so anyone can still pass a proposal.
A proposal can do much less now. The Freezer still holds about 12 million X, and users' frozen stakes are a small part of it. The code keeps those stakes back after every proposal. The rest is the treasury's, but its limit on putting X into markets is used up, with two millionths of an X to spare. A swap can't sell more of it unless X first comes back into the treasury.
X100 had not posted about the attack on its X account when we checked. Someone did send 0x7ec2 an on-chain message offering a return-for-bounty deal and saying they were in touch with the X100 team. That wallet was first funded the same evening and has never sent coins to, or received coins from, any X100 wallet. We could not confirm that X100 had approved the offer.
10 · What the first reports saidChecking the early numbers
Blockaid, Chainalysis and Defimon posted about the attack within hours. Blockaid's thread got the totals right. We checked each claim against the record, including Chainalysis's summary and Defimon's breakdown.
| Source | Claim | What the record shows | Verdict |
|---|---|---|---|
| Blockaid | About $4.85M in USDT taken across two transactions | 4,846,108 USDT in two transactions | Right |
| Blockaid | A third attacker pulled about 550,000 X | 549,916 X taken in the third transaction | Right |
| Blockaid | About 12.2M X still in the Freezer | 12.17 million X, of which 171,563 X is users' frozen stake | Right |
| Chainalysis | About $4.7M in stablecoins across three transactions | $4.85M across two. The third took X and $1,909 | Off |
| Chainalysis | About 560,000 X unsold at attacker addresses | 826,937 X unsold, counting the X left in the first attack contract | Low |
| Chainalysis | Swapped to ETH and split across four wallets of 400 ETH | True, and a fifth wallet still holds 422.86 ETH | Incomplete |
| Defimon | The attacker sold the treasury's 400,000 X in the real pool | It sold 131,703 X. The other 268,284 X is still in its contract | Off |
| Defimon | About $4.75M taken and 361,800 X out of the treasury | 4,749,726 USDT; 400,000 X out, less the 38,200 X the attacker froze and paid in fees | Right |
11 · What it meansWhat the X100 hack means for holders and other DAOs
For people who hold frozen X, the code keeps proposals away from their coins. The open seats can still pass proposals, but the treasury has used up its limit on putting X into markets, and X has almost no market today. Anyone who bought X on 24 October now holds a coin that last traded far below what they paid.
For other projects, flash loan governance attacks are old news. The best known hit Beanstalk in April 2022, when a borrowed fortune passed a proposal that drained the protocol. Many voting systems now count votes from a snapshot taken before a proposal opens, so coins borrowed later don't count. Many also make a passed proposal wait, often for days, before it can run. The Freezer did neither. It also let a proposal pick any pool and any minimum price.
The same week, a single wallet drained Arkadiko on Stacks by buying enough votes to pass its own proposal. We traced that one in the Arkadiko hack. Other recent thefts we followed include the WAX bridge hack and the Initia hack.
12 · How we traced itMethod and limits
We read all three attack transactions, and every transfer around them, with Bitquery's real-time Ethereum data. We then checked the key figures a second way, against raw records from public Ethereum nodes. The seat rankings come from the Freezer's own event log and from its records at the blocks just before each attack. Our address labels named the swap services and routers. Dollar values use USDT at $1 and the attacker's own ETH price.
Any wallet in this story can be followed with the Bitquery MCP, which lets you ask an AI assistant where a wallet's money went. The full Ethereum history is also sold as files. Bitquery also does this work for clients through its crypto investigation services, and we traced the CoinDCX hack the same way.
Balances, seats and the Freezer's totals were read at block 26,267,255, 04:19 UTC on 25 October. Anything after that is not covered.
Dollar values count USDT at $1. ETH is valued at $2,349, the price the first attacker got when it swapped its USDT. X is not given a dollar value, because its only pool is almost empty.
We call 0xa13a, 0xe921 and 0xb18c Senate members because the Freezer's records show them holding seats and voting on its first six proposals. We do not know who controls them, or whether they speak for X100.
We name FixedFloat, ChangeNOW, Wintermute, OKX, Aave, Morpho and the other services only for the role their contracts or wallets played in a transfer. Nothing here suggests any of them knew about or took part in the attacks.
We found no direct transfer between the second attacker and the third wallet. That does not show they are unrelated.
The record shows which wallets moved money and when. It does not show who controls them.
13 · The addressesWhere to look
These are the main wallets, contracts and transactions in this story.
Follow the X100 money in plain English
Every transfer in this story comes from Bitquery's Ethereum data. The Bitquery MCP server puts that data behind an AI assistant, so you can ask where a wallet's money went, or which labels an address carries, without writing a query. The full history is also sold as files on the Bitquery Data Store, as the Ethereum dataset.
This article is provided for informational and educational purposes only and reflects analysis of publicly available on-chain data as of the dates indicated. It does not constitute legal, financial, compliance, or investment advice, and nothing in it is a recommendation to buy, sell, hold or freeze any token or asset, or to use or avoid any protocol, exchange or service.
The findings describe transactions and balances observed on Ethereum between 21 September and 25 October 2026. Attributions come from Bitquery's address labels and from on-chain behaviour; they may be incomplete or incorrect and may be revised as more data becomes available.
References to X100, Blockaid, Chainalysis, Defimon, FixedFloat, ChangeNOW, Wintermute, UniswapX, Uniswap, PancakeSwap, OKX, 1inch, Aave, Morpho, Bitget, c0ffeebabe.eth or any other named project, company, service or person describe what the public record shows about addresses and transactions linked to them, and what those parties have said in public. They are not statements about any party's intent, security practices, solvency or conduct, and nothing here asserts that any named party acted unlawfully or negligently. The wallets that took the funds are described by their behaviour and attributed to nobody.
Nothing herein should be relied upon as a definitive determination of fact. Readers should conduct their own independent verification before taking any action. The authors and publisher accept no liability for any loss or damage arising from reliance on this material. All trademarks and company names are the property of their respective owners.
Reported by Gaurav Agarwal for Bitquery Research, with AI tools; every figure was checked against the raw data.
FAQ
Was X100 hacked?
Yes. On 24 October three wallets used X100's own voting system to make its treasury sell X for almost nothing. They took two of the three Senate seats by locking slightly more X than the holder they had to beat, then voted for swaps that sent the treasury's X into pools they controlled.
How much was stolen in the X100 hack?
About $4.85 million in USDT, taken in two transactions, almost all of it by the first attacker. A third wallet took X rather than dollars. The attackers still hold about 827,000 X that they have not been able to sell.
What is a flash loan governance attack?
It is a vote won with borrowed money. A flash loan lends coins for a single transaction. The attacker uses them to buy voting power, passes a proposal and pays the loan back before the transaction ends. It works when votes are counted at that moment and a passed proposal can run at once, as it could at X100.
Where did the stolen X100 funds go?
The first attacker swapped its USDT for ETH and spread it across five new wallets, which had not moved when we last checked. The second attacker swapped its share for ETH and sent it to ChangeNOW, a swap service, within half an hour.
Is the X100 Senate still controlled by the attackers?
Two of its three seats are still held by helper contracts left by the second attacker, and those contracts accept calls from anyone. Anyone who uses them can pass a proposal. But the treasury has used up its limit on putting X into markets, so a new swap can't sell more of its X unless some comes back first.
Can the attackers take frozen X?
No. After every proposal the Freezer must still hold at least as much X as users have frozen, so proposals cannot touch it. The treasury's own X is also hard to move now, because the treasury has used up its limit on putting X into markets.