Two votes, millions of USDT and an almost empty pool: breaking down the attack on X100

Two votes, millions of USDT and an almost empty pool: breaking down the attack on X100

A lead of 0.000001 tokens was enough to win two seats on the X100 senate, after which about 4.85M USDT left the legitimate pool.

Oct 31, 2026

In the first operation, the initiating wallet received about 4.75M USDT after repaying a flash loan, while the deposits used for voting stayed locked. On October 24, 2026, borrowed USDT was used to buy enough X tokens to take two of the three seats on the X100 senate. The majority obtained immediately approved treasury trades through liquidity controlled by the executing contract. Selling the X tokens received made it possible to repay the loan and pay out the remaining funds. Across the three main transactions, about 4.848M USDT was paid out to recipients. Including two further transactions, the net USDT outflow from the legitimate pool reached about 4.849M USDT.

The core mechanism is confirmed by historical transaction records. The tracing covers individual routes of the funds received up to the stated cut-off point; the final service address was identified by a label in the blockchain explorer.

First Transaction – a Borrowed Stake Gives Control of the Senate, Access to Treasury Assets and the Ability to Pay Out to the Recipient. Visualization: CertiK
First Transaction – a Borrowed Stake Gives Control of the Senate, Access to Treasury Assets and the Ability to Pay Out to the Recipient. Visualization: CertiK

Addresses and their roles

All the addresses below are on the Ethereum network. The roles describe the observed behavior of the accounts, not the identities of the people who control them.

AddressEstablished role
0x100a2c7f45fd48e217fdce72e658dc78fd43a100The X token; six decimal places
0x79f35a33fe2813414851c4ae8daeacd14d822a46Freezer: holds deposits, senate powers and treasury assets
0xcd5762ac6013fa762782ac1797ab09152c1028e8Treasury DEX module
0x0d85edd90c94053fc5997551b1baa8a77aa02fa0Legitimate X/USDT pool
0x7ec2afdf3ec5964899894f8d58afa95cbb8ffd63Sender of the first transaction and recipient of USDT
0x37541fc4a6f1ec86889ba506f51dc39f2bedd10aExecuting contract of the first transaction; kept the X tokens

Background

X100 users lock X tokens in the Freezer contract. The senate ranks registered accounts by their current amount of locked tokens. Two votes out of three are enough to approve operations involving treasury liquidity and swaps. Registration fees are charged separately from locked deposits.

The Freezer holds treasury X tokens alongside user deposits. After an operation is executed, the contract checks whether enough X remains to cover its obligations on frozen funds. A separate token limit caps the amount of assets that can be deployed on the market. Withdrawing liquidity positions frees up room under this limit. However, none of these measures on its own guarantees that treasury trades are carried out on fair terms.

How the attack unfolded

The attacker carried out a complex sequence of actions that made it possible to exploit a vulnerability in the smart contract's source code.

1. Gaining control of the senate

At 14:11:47 UTC, the first transaction, included in block 26,263,022, borrowed 1,942,457.637245 USDT from Aave and bought about 38,200 X tokens. Two auxiliary accounts each locked 19,000.000001 X and separately paid 100 X each to be nominated.

Before that, second place in the ranking was held by a participant with 19,000 X.

Because voting was based on the current ranking and executing a decision did not require waiting a set period, the new majority carried out the operation within the same transaction.

2. Turning powers into treasury assets

The majority obtained approved a swap of 400,000 X for about 35.68 USDT through liquidity created and controlled by the operation itself. The executing contract received about 399,987 X and then sold about 131,703 X on the legitimate market for about 6.693M USDT.

Aave received about 1.943M USDT, including a financing fee of about 971.23 USDT. The initiating wallet received about 4.75M USDT, and the executing contract kept about 268,284 X. The deposits used for voting stayed locked: the funds received made it possible to repay the loan without unlocking the tokens. The settlement records show successive stages in the movement of the same money; these amounts cannot be added together, as that would double-count the losses.

3. Regaining and reusing powers

At 14:35:59, the second transaction used a 1.95M USDT flash loan from Morpho to create two deposits of 19,000.000002 X and displace the first pair of participants. Five withdrawals of treasury liquidity positions returned about 50,000 X, freeing up room under the limit before the next self-dealing swap. After repaying the loan, the recipient received about 96,382 USDT and 9,895 X.

At 14:40:47, the third transaction used the powers already held by the auxiliary contracts from the second operation, without acquiring any new locked tokens. To do this, it took a 300 USDT flash loan and withdrew a large treasury liquidity position. The final payout came to about 1,909 USDT and 549,916 X. Historical contract calls show that the operation used auxiliary accounts to submit proposals and vote with the senate seats already obtained. According to Bitquery, the reuse was possible because the auxiliary contracts' functions that open access to governance did not restrict which addresses could call them. However, this access control explanation was not independently verified as part of this analysis. Different initiating wallets do not, on their own, prove that different people were behind them.

Two more transactions followed at 14:40:59 and 14:41:23. They increased the net USDT outflow from the pool by about 168.61 USDT. Both transactions were sent by the same address, and their sequence numbers (nonces) were consecutive.

Main transactionUSDT paid out to recipientNet USDT outflow from legitimate pool
First4,749,726.0969734,750,733.001112
Second96,381.88349196,381.884163
Third1,909.3587581,873.897121
Total for the three main transactions4,848,017.3392224,848,988.782396

The third payout also used USDT previously received from the treasury. So the payout amount exceeds the reduction in pool funds caused directly by that transaction. Adding the two subsequent transactions, the combined outflow from the pool across all five transactions comes to 4,849,157.396718 USDT. Borrowed funds, payouts, swaps and assets remaining at addresses partly relate to the same money flows. Unsold X tokens are not included in the dollar estimate.

4. Swapping and moving the funds received

The first recipient swapped about 4.75M USDT for 2,022.016 ETH. A consolidating address then received this ETH along with funds it already held and sent four batches of 400 ETH. At the data cut-off point, October 26 at 01:20:23 UTC, the five checked holding addresses held about 2,022.857 ETH, including small balances unrelated to the funds from this conversion.

The second recipient swapped about 96,382 USDT for 40.908 ETH. Two intermediate addresses moved about 40.900 ETH to an address that Etherscan labels as ChangeNOW Dep. This is where the tracing of funds ends: the customer's identity, further settlements and whether the money was finally cashed out have not been confirmed.

Verified Routes of the Funds and the Addresses Where They Were Found. Visualization: CertiK
Verified Routes of the Funds and the Addresses Where They Were Found. Visualization: CertiK
A 100x pump, a $75M loan and a blockchain rollback: what happened to Tectonic?Sep 5, 2026Read more

The vulnerability

The cost of gaining control of governance bore almost no relation to either the market value of the assets or the size of the deposit needed to vote. The majority obtained was able to withdraw enough liquid funds to repay the loan it used to buy control, even though the voting deposits stayed locked.

Three design features made this situation possible:

  • Powers arose immediately after a new deposit was made. The Freezer._stakeOf and Senate._tally functions used the current amount of locked tokens and the participants' ranking. A proposal's validity period limited the window during which it could be executed, but the examined execution path had no minimum delay before execution. Two new accounts gained a majority and used it immediately.
  • Votes for a valid proposal allowed self-dealing trades. The DEX module checked whether the relevant tokens were allowed and whether the pool existed, and then accepted the minimum return specified in the proposal. It did not provide an independent check of whether the trade terms were fair and did not rule out the use of liquidity controlled by the executor. So a formally approved operation made it possible to withdraw treasury assets on terms set by the operation itself.
  • Quantity checks protected only a narrower condition. The check that the total amount of frozen funds was covered kept the recorded X token obligations in line. At the same time, withdrawing liquidity positions freed up room under the limit on deploying assets on the market. None of these checks limited the acceptable losses in treasury value. In addition, the auxiliary contracts allowed powers already obtained in a previous operation to be reused.

Response and recovery

The collected materials contain no independent confirmation that the funds were returned or that the vulnerability was effectively fixed. At the recorded cut-off point, about 1.97 USDT remained in the legitimate pool, and the three checked execution and payout addresses held about 826,902 X. These illiquid X balances cannot be reliably valued in dollars based on the state of a drained market.

The Freezer still covered the recorded obligations on frozen deposits, and the senate still had the two seats obtained during the second operation and controlled by contracts. Only 0.000002 X remained before the observed deployment limit. However, this snapshot does not prove that control of governance was restored or that its mechanism was fixed.

In retrospect: the price of control

Other attacks on governance mechanisms make it possible to compare how much money was needed to gain control, what powers this control gave and how much of the assets' value was actually realized.

IncidentDateReported damage
BonkDAOJuly 6, 20264.426 trillion BONK moved, valued at about $19.3M
Term FinanceAugust 23, 2026About $8.46M in ETH and USDC
Astroport / NeutronSeptember 22, 2026About $9.4M in total asset value; $1.96M in liquid assets
ArkadikoOctober 22, 2026About $1.09M as part of the drain of Arkadiko

These cases and estimates are based on published reports; the full sequence of actions in each attack was not independently reconstructed. The calculations use different valuation approaches, and the stated value of tokens does not, by itself, prove that they could be sold for the corresponding amount.

Financial exposure. In the BonkDAO case, the voting tokens were returned, and in the Arkadiko case, the DIKO tokens were resold. This differs from the X100 situation, where the deposits stayed locked. The capital needed to gain control and the funds that remain at risk afterwards are different indicators. The full net cost of gaining control in these cases was not independently reconstructed. According to reports, in Term Finance control was gained through a wrapper around the governance token, with only a small number of such tokens issued; execution followed after the voting period.

Powers. According to published data, the sequence of events at Astroport / Neutron included eleven reassignments of contract administrators, followed by ten malicious migrations and asset withdrawals. At Arkadiko, a privileged contract was approved whose public withdrawal and minting functions did not check the caller's permissions. At X100, the majority instead approved self-dealing treasury trades. In all these cases, voting rights gave access to different ways of controlling assets.

Realizable value. Only part of the stolen BONK was moved to an exchange; depositing tokens to an exchange address does not, by itself, prove that they were sold. X100 kept unsold X tokens whose possible proceeds cannot be reliably determined. Burning USDA tokens at Arkadiko reduced the unbacked supply but did not return the collateral. The estimated value of treasury tokens, the amount of tokens issued and the funds actually received from a sale are different indicators.

#Tether#Hack#Ethereum#DeFi