---
title: "Radix DEX Pool Drain (November 2026)"
url: "https://radix.wiki/contents/history/dex-pool-drain-november-2026"
updated: 2026-11-14
license: CC-BY-4.0
license_url: "https://creativecommons.org/licenses/by/4.0/"
version: "1.0.1"
---

# Radix DEX Pool Drain (November 2026)

| Date | 14 November 2026, 02:17 to 10:35 UTC |
| --- | --- |
| Account | [account_rdx12ywzw…e87f3](https://dashboard.radixscan.io/account/account_rdx12ywzw3zurr3jany83229tm3zt5a9zupfzkmqc3akuyl2fccuze87f3), 29,524 transactions |
| Flash-loan drains | 1.16m $XRD from 14 first-version [Ociswap](/ecosystem/ociswap) Flex Pools |
| Rounding drains | 0.0048 $xwBTC and 0.00073 $hWBTC from [CaviarNine](/ecosystem/caviarnine) and [DeFiPlaza](/ecosystem/defiplaza) pools |
| Network fees paid | 184,578 $XRD |
| Exit | 1.32m $XRD and 58.62 $hUSDC to Base over [Hyperlane](/ecosystem/hyperlane), 10:09 to 10:11 UTC |

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](/ecosystem/hyperlane). It used two flaws. The first is the flash-loan flaw in the first version of [Ociswap](/ecosystem/ociswap)'s Flex Pool, described after the [27 October exploit](/contents/history/ociswap-flex-pool-exploit-2026), 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](/ecosystem/caviarnine) and [DeFiPlaza](/ecosystem/defiplaza) pools holding wrapped bitcoin, taking a few satoshis per transaction, 28,500 times.

The account was [funded with 2,637 $XRD](https://dashboard.radixscan.io/transaction/txid_rdx1yjr4maxcd79y2mfqdtanwtyz2y2y5hagrhvk2may8v3ara2r0npqu6v0t7/summary) 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](https://t.me/ociswap/245777) 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](https://dashboard.radixscan.io/transaction/txid_rdx1jt9d8gv7zncf8wnw8jtgafh4y8yy6j7r4hgxq8eyads8m2q8eueqdu24wp/summary) on the [RBX/XRD Flex Pool](https://dashboard.radixdlt.com/component/component_rdx1cpcwm3w254rjc74xpqjcla08tjd6ms3eyzc5yfmhuwuha6vas0dr2c), makes four calls in one manifest:

1. It swaps 3,374 $XRD for $RBX in the pool.
2. It borrows 309,102 $RBX from the same pool by flash loan, which leaves the pool's $RBX vault nearly empty.
3. With the loan still open, it swaps 3,060 $RBX back into the pool, which prices them against the emptied vault.
4. 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](https://dashboard.radixdlt.com/component/component_rdx1cpcwm3w254rjc74xpqjcla08tjd6ms3eyzc5yfmhuwuha6vas0dr2c) | 295,871 |
| [RWT/XRD](https://dashboard.radixdlt.com/component/component_rdx1crtntm85kkjfvv2pewdqhpgjx3dz95rdwv4hq4aju7ta4evg5kl552) | 224,759 |
| [XRD/$CVX](https://dashboard.radixdlt.com/component/component_rdx1crzyyrrlu3t6yftk4z2v7uf3g54fh0y98z08zvk6sgwlxkkzl6avmc) | 141,991 |
| [ILIS/XRD](https://dashboard.radixdlt.com/component/component_rdx1cr9tj8xd5cjs9mzkqdnamrzq0xgy4eylk75vhqqzka5uxsxatv4wxd) | 90,436 |
| [XRD/LOCK](https://dashboard.radixdlt.com/component/component_rdx1cpyeyjsyfc0lkh4fhp0tjzdh2wsuqyfywt6x9gc42ru4q4pcevldpr) | 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`](https://dashboard.radixdlt.com/package/package_rdx1pkzxm6nw55wvz0e2fn79hd8t07834cxa8kpdlhq8s5lp5ldqpcglwe), 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](https://github.com/radixdlt/radixdlt-scrypto/blob/858c70f1504c1f8dd75d76a66e53e0a889bad8f3/radix-engine/src/blueprints/pool/v1/v1_1/two_resource_pool_blueprint.rs#L345-L387) 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](https://github.com/radixdlt/radixdlt-scrypto/blob/858c70f1504c1f8dd75d76a66e53e0a889bad8f3/radix-engine/src/updates/anemone.rs#L125-L130) replaced [rounded first](https://github.com/radixdlt/radixdlt-scrypto/blob/858c70f1504c1f8dd75d76a66e53e0a889bad8f3/radix-engine/src/blueprints/pool/v1/v1_0/two_resource_pool_blueprint.rs#L311-L327) and issued pool units on the rounded amount.

One of the account's [transactions against DeFiPlaza](https://dashboard.radixscan.io/transaction/txid_rdx19evyxycn5agank28t42fqw2tskw22ec6w7daxrvedc8j5cm4qgksyefsca/summary), at 10:35 UTC:

1. It withdraws 32 satoshis of $xwBTC and 30.19 $XRD.
2. It calls DeFiPlaza's `add_liquidity` 16 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.
3. It redeems all the pool units at once, directly on the [native pool](https://dashboard.radixdlt.com/component/pool_rdx1c5xlqz5uc62fzlsyl2f3ql6lx8upc75tdpe4f8cmys83lpqrrul976), 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](https://dashboard.radixscan.io/transaction/txid_rdx1wf3lwjcfjwad6ff6z2tjq9ue9eg7yrtflq85jehjzn0pysl9l7esmgpamm/summary) is the same with 23 deposits per transaction, and took about 20 satoshis each time.

| Pool | Operator | Transactions | Taken | Fees paid |
| --- | --- | --- | --- | --- |
| [xwBTC/XRD](https://dashboard.radixdlt.com/component/component_rdx1cq5yedh7keq63t746lf5y58f2cecrngd3mxj8pztm52l4x5cvs0xp3) | CaviarNine | 22,173 | 0.0044 $xwBTC | 146,753 $XRD |
| [xwBTC/XRD](https://dashboard.radixdlt.com/component/component_rdx1czzqr5m40x3sklwntcmx8uw3ld5nj7marq66nm6erp3prw7rv8zu29) | DeFiPlaza | 2,607 | 0.00034 $xwBTC | 13,680 $XRD |
| [hWBTC/hUSDC](https://dashboard.radixdlt.com/component/component_rdx1czs3nlt4vx8rq0qytvxtsxmjvppd29n72quelmvww4kx25ryz5jk0q) | CaviarNine | 2,463 | 0.00049 $hWBTC | 14,309 $XRD |
| [HIT/hWBTC](https://dashboard.radixdlt.com/component/component_rdx1cpzjc2pp6vurvhxcm73nw0gta4u4nn9y06n6dr2k3f2afnjj3fcgfr) | 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](https://dashboard.radixdlt.com/component/component_rdx1crd7xk0nu07kj60artzz6evws7r6w69lwarf0nqmkxuwwluy5xjud0): 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](https://dashboard.radixscan.io/account/account_rdx129phk3hklynqsv6752xg4uezn0yv57s6qvjlh8s38khfhx8fc2j4t5), 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](https://dashboard.radixscan.io/transaction/txid_rdx1974eyg3wvu7m9n3qtyfugnny047kp0wpn8jyp50cfutjdpfhvnassaqvcc/summary). 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](https://dashboard.radixdlt.com/component/component_rdx1crrj42g0855jnpvfs6t9tff25vtq3lm292g3h07xrnz9l49mnsu3hy) and its $hUSDC route, with destination domain 8453, which is [Base](https://github.com/hyperlane-xyz/hyperlane-registry/blob/main/chains/base/metadata.yaml), and an EVM recipient ending `ff0c`. They carried 1,315,856 $XRD and 58.62 $hUSDC, [the largest](https://dashboard.radixscan.io/transaction/txid_rdx1m5hhtyfvzk4j792awrn5xxf3eytnfqvu5a6hw56r2t7w8ncmvcts54vv2m/summary) 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](/contents/history/ociswap-flex-pool-exploit-2026) and the [August 2026 asset drain](/contents/history/hyperlane-asset-drain-2026) 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](https://t.me/radix_dlt/1012163), 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](/contents/tech/core-concepts/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.

## External links

- [The account on RadixScan](https://dashboard.radixscan.io/account/account_rdx12ywzw3zurr3jany83229tm3zt5a9zupfzkmqc3akuyl2fccuze87f3)
- [The RBX/XRD Flex Pool drain](https://dashboard.radixscan.io/transaction/txid_rdx1jt9d8gv7zncf8wnw8jtgafh4y8yy6j7r4hgxq8eyads8m2q8eueqdu24wp/summary)
- [A DeFiPlaza rounding transaction](https://dashboard.radixscan.io/transaction/txid_rdx19evyxycn5agank28t42fqw2tskw22ec6w7daxrvedc8j5cm4qgksyefsca/summary)
- [The largest Hyperlane transfer](https://dashboard.radixscan.io/transaction/txid_rdx1m5hhtyfvzk4j792awrn5xxf3eytnfqvu5a6hw56r2t7w8ncmvcts54vv2m/summary)
- [The native TwoResourcePool source](https://github.com/radixdlt/radixdlt-scrypto/blob/858c70f1504c1f8dd75d76a66e53e0a889bad8f3/radix-engine/src/blueprints/pool/v1/v1_1/two_resource_pool_blueprint.rs)
