On 14 November 2026 one Radix account took about 1.32m $XRD out of decentralized-exchange pools in 29,524 transactions over nine hours, and sent it to Base, an Ethereum layer-2 network, over Hyperlane. It used two flaws. The first is the flash-loan flaw in the first version of Ociswap's Flex Pool, described after the 27 October exploit, which drained 14 Flex Pools that still held liquidity for 1.16m $XRD. The second is a rounding error in Radix's native two-token pool. The account used it on CaviarNine and DeFiPlaza pools holding wrapped bitcoin, taking a few satoshis per transaction, 28,500 times.
The account was funded with 2,637 $XRD at 01:24 UTC and made its first pool call at 02:17. Its last transaction committed at 10:35.
How did the Flex Pools lose 1.16m $XRD?
By the method used on 27 October, repeated on every first-version Flex Pool that still held $XRD. Ociswap had asked liquidity providers in those pools to withdraw on 27 October. A flash loan lends tokens that must be repaid before the transaction that borrowed them finalizes, and a first-version Flex Pool lends out of the same vault it prices swaps from.
The largest drain, at 09:08 UTC on the RBX/XRD Flex Pool, makes four calls in one manifest:
- It swaps 3,374 $XRD for $RBX in the pool.
- It borrows 309,102 $RBX from the same pool by flash loan, which leaves the pool's $RBX vault nearly empty.
- With the loan still open, it swaps 3,060 $RBX back into the pool, which prices them against the emptied vault.
- It repays the loan with 309,380 $RBX.
The pool lost 286,895 $XRD in that transaction and 8,976 more in a second one 43 seconds later. Between 08:41 and 09:33 the account made 28 transactions that took a flash loan, and 15 of them drained 14 pools:
| Flex Pool | $XRD taken |
|---|---|
| RBX/XRD | 295,871 |
| RWT/XRD | 224,759 |
| XRD/$CVX | 141,991 |
| ILIS/XRD | 90,436 |
| XRD/LOCK | 79,751 |
| Nine others | 12,000 to 55,000 each |
| Total | 1,157,378 |
Every one of the 14 is built from the first Flex Pool package, package_rdx1pkzxm…qcglwe, read from the Radix Gateway. The account also took the pools' other tokens and sold them between 09:31 and 09:38 for about 150 $XRD in all, since each was nearly worthless once its pool's $XRD was gone.
How does depositing in small pieces take tokens from a pool?
Radix's native TwoResourcePool, a pool component built into the Radix Engine, issues pool units for a deposit before it rounds the deposit, and so issues slightly more than it takes. Pool units are the tokens a pool hands to the people who deposit into it, redeemable for a share of its contents. CaviarNine's Simple Pools and DeFiPlaza both keep their liquidity in this native pool.
When a deposit arrives, the pool's contribute method works out how much of each token keeps the pool's ratio, issues pool units for those exact amounts, and only then takes the tokens, rounding each one down to the smallest unit the token allows. For $XRD, which divides to 18 decimal places, the gap is too small to matter. Wrapped bitcoin divides to eight, so its smallest unit is a satoshi, and the gap is up to one satoshi per deposit. The version of the method that the Anemone protocol update replaced rounded first and issued pool units on the rounded amount.
One of the account's transactions against DeFiPlaza, at 10:35 UTC:
- It withdraws 32 satoshis of $xwBTC and 30.19 $XRD.
- It calls DeFiPlaza's
add_liquidity16 times, offering 2 satoshis and 1.26 $XRD each time. Each time the pool works out that 1.26 $XRD matches 1.9 satoshis, issues pool units for 1.9, takes 1 and hands the other back. - It redeems all the pool units at once, directly on the native pool, and receives 30 satoshis and 20.19 $XRD.
It ends 14 satoshis up, for a network fee of 5.46 $XRD. The account sold its bitcoin at about 80m $XRD per bitcoin, which makes 14 satoshis worth about 11 $XRD. The CaviarNine routine is the same with 23 deposits per transaction, and took about 20 satoshis each time.
| Pool | Operator | Transactions | Taken | Fees paid |
|---|---|---|---|---|
| xwBTC/XRD | CaviarNine | 22,173 | 0.0044 $xwBTC | 146,753 $XRD |
| xwBTC/XRD | DeFiPlaza | 2,607 | 0.00034 $xwBTC | 13,680 $XRD |
| hWBTC/hUSDC | CaviarNine | 2,463 | 0.00049 $hWBTC | 14,309 $XRD |
| HIT/hWBTC | CaviarNine | 1,253 | 0.00024 $hWBTC | 8,300 $XRD |
The account sold 0.0047 $xwBTC for 370,010 $XRD in the CaviarNine and DeFiPlaza $xwBTC pools, and 0.00069 $hWBTC for 96,118 $XRD in Ociswap's hWBTC/XRD Precision Pool: 466,128 $XRD against 183,042 $XRD of fees. It also swapped 0.000045 $hWBTC into the CaviarNine HIT/hWBTC pool, whose $hWBTC side it had drained, for 834m $HIT, which it still holds. $hWBTC is bitcoin bridged over Hyperlane; $xwBTC is bitcoin wrapped by Instabridge.
A second account, account_rdx129phk…t5, funded by the first from 04:28 UTC, ran the same routine against CaviarNine's hWBTC/XRD pool until 07:08 UTC. Its transactions are not in this page's totals.
Where the $XRD went
Between 06:32 and 07:57 UTC the account bought 58.56 $hUSDC, Hyperlane-bridged USD Coin, for 132,261 $XRD in 19 swaps on DeFiPlaza. That prices $XRD at about 0.00044 dollars.
Between 10:09 and 10:11 UTC it made four calls to transfer_remote on Hyperlane's XRD warp route and its $hUSDC route, with destination domain 8453, which is Base, and an EVM recipient ending ff0c. They carried 1,315,856 $XRD and 58.62 $hUSDC, the largest 665,631 $XRD. At the account's own $hUSDC price that is about 640 dollars. The same route carried the proceeds of the 27 October exploit and the August 2026 asset drain off Radix.
Read from the Gateway at 11:00 UTC, the account held 5,646 $XRD and 834m $HIT.
What happens next
A member of the main Radix Telegram group reported the drains at 09:45 UTC, naming the first-version Flex Pools and CaviarNine's bitcoin pools. Ociswap has said the Flex Pool flaw is confined to that first package; the RBX/XRD pool held 143 $XRD afterwards.
The rounding flaw is in a native blueprint, so it is present in every pool built on that blueprint, and the native MultiResourcePool computes its pool units in the same order. The OneResourcePool, which holds a single token, keeps the whole deposit and has no such gap (Radix Pools). A deposit gains less than one smallest unit of the coarser token, so the flaw pays only where that unit is worth more than a network fee. Wrapped bitcoin is the case on Radix today: at 80m $XRD per bitcoin a satoshi is worth 0.8 $XRD, against a fee of about 0.3 $XRD for a transaction that makes a single deposit and redeems it. A native blueprint changes only through a protocol update, as the pool code did at Anemone. By 16:15 UTC the account had made no transaction since 10:35, and none of Ociswap, CaviarNine or DeFiPlaza had posted a statement in its Telegram group; this page will carry their statements when they appear.
