Ошибка округления на 128 млн долл аров: как математический баг стоимостью меньше цента опустошил старейший AMM в DeFi в девяти сетях
Восемь вей (wei). Это примерно 0,000000000000000008 токена — количество настолько малое, что оно не имеет значимой долларовой стоимости. Тем не менее, 3 ноября 2025 года злоумышленник превратил ошибки округления такого масштаба в 128 миллионов долларов похищенных активов, опустошив пулы Composable Stable Pools протокола Balancer в девяти блокчейнах менее чем за тридцать минут.
Эксплойт Balancer V2 теперь является крупнейшим в истории мультичейн-взломом DeFi, вызванным одной уязвимостью. За одну ночь он уничтожил 52% от общего объема заблокированных средств (TVL) Balancer, прошел более десяти аудитов безопасности от ведущих фирм отрасли и вынудил одну сеть — Berachain — провести экстренный хардфорк, чтобы вернуть средства. Уязвимость? Всего одна строка кода, которая выполняла округление в неверном направлении.
Как работают пулы Balancer — и где они сломались
Balancer V2 использует концепцию, заимствованную из модели StableSwap от Curve: математический инвариант под названием D, который представляет общую стоимость активов, заблокированных в пуле. Каждый раз, когда пользователь обменивает токены, протокол пересчитывает D, чтобы гарантировать сбалансированность пула. Цена токенов Balancer Pool Tokens (BPT) — LP-т окенов, которые пользователи получают при внесении ликвидности — рассчитывается непосредственно из этого инварианта: Цена BPT = D / totalSupply.
Перед расчетом D протокол должен нормализовать балансы токенов до общей точности с помощью функций масштабирования. Именно здесь крылась фатальная ошибка.
Функция _upscaleArray использовала mulDown (округление вниз) при конвертации необработанных балансов токенов в масштабированные значения. Для балансов обычного размера — тысяч или миллионов токенов — округление вниз на долю вей не имеет значения. Но когда баланс токена прижимается к границе всего в 8–9 вей, целочисленное деление в Solidity превращает эту крошечную ошибку округления в массивное относительное искажение.
При 8 вей округление вниз даже на 1 вей представляет собой потерю точности на 12,5%. Подставьте этот искаженный баланс в расчет инварианта, и D упадет. Когда падает D, падает и цена BPT. Когда цена BPT падает искусственно, злоумышленник может купить их дешево и погасить по полной стоимости.
Атака: 65 микро-обменов в одной транзакции
Система мониторинга блокчейна Check Point Research зафиксировала эксплойт в 07:46 UTC 3 ноября 2025 года. К тому времени смарт-контракт злоумышленника уже выполнял разрушительную последовательность действий.
Атака разворачивалась в три этапа, упакованных в одну транзакцию batchSwap, содержащую 65 операций обмена:
Этап 1 — Прижатие к границе. Злоумышленник обменивал большие объемы BPT на базовые токены, намеренно истощая баланс одного из токенов в пуле до критического порога в 8–9 вей. При таком балансе каждая последующая операция с этим токеном вызывала максимальную потерю точности.
Этап 2 — Накопление ошибки. Когда один токен был зажат у границы округления, злоумышленник совершил серию быстрых мелких обменов. Каждый обмен заставлял функцию _upscaleArray округлять значение вниз при масштабировании, что приводило к систематическому заниже нию инварианта D. Потеря точности при одном обмене была незначительной. Но в ходе 65 операций в рамках одного вызова batchSwap потери накапливались драматически — достаточно, чтобы искусственно подавить цену BPT значительно ниже ее истинного значения.
Этап 3 — Покупай дешево, продавай дорого. Злоумышленник покупал BPT по заниженной цене, а затем немедленно обменивал эти токены на базовые активы по полной стоимости. Разница между манипулируемой ценой и реальной ценой была чистой прибылью.
Вся последовательность — от первого обмена до окончательного вывода средств — заняла менее тридцати минут. Злоумышленник развернул кастомные смарт-контракты с логикой эксплойта, встроенной в конструктор, что означало автоматическое выполнение атаки сразу после развертывания без необходимости дальнейшего взаимодействия.
Девять сетей, один баг
То, что превратило этот серьезный эксплойт в исторический, — это радиус поражения. Один и тот же уязвимый код работал в каждой сети, где были развернуты пулы Composable Stable Pools протокола Balancer V2:
- Ethereum — крупнейшие пулы и самые тяжелые потери
- Arbitrum — значительная ликвидность была выведена
- Base — L2-сеть от Coinbase подверглась удару
- Optimism — пулы OP Stack опустошены
- Polygon — целью стали пулы, существующие долгое время
- Avalanche — скомпрометированы пулы C-Chain
- Gnosis — затронуты меньшие объемы, но всё же пострадали
- Berachain — недавно запущенная сеть сильно пострадала
- Sonic — новейшее развертывание также оказалось уязвимым
Злоумышленнику не требовалось девять различных эксплойтов. Нужен был всего один, развернутый девять раз. Общая кодовая база Balancer, обеспечивавшая эффективное мультичейн-развертывание, стала вектором для одновременного разрушения в нескольких сетях.
Важно отметить, что другие типы пулов Balancer (Weighted Pools, Managed Pools) и более новый протокол V3 остались совершенно не затронуты. Баг был специфичен для мате матики пулов Composable Stable Pool.
Крах TVL
До эксплойта объем заблокированных средств (TVL) в Balancer V2 составлял 442 миллиона долларов. В течение 24 часов это число рухнуло до 214 миллионов долларов — падение на 52%. По мере распространения новостей и того, как поставщики ликвидности в спешке выводили средства из незатронутых пулов в целях предосторожности, TVL продолжал снижаться, достигнув примерно 182 миллионов долларов в последующие недели.
Для протокола, который был столпом DeFi с 2020 года, это падение было сокрушительным. Balancer пережил медвежий рынок 2022 года, крах Terra и имплозию FTX. Ошибка округления сделала то, чего не смогли макрокатастрофы.