Как FoxMarket посчитал токены по старой цене и потерял $119 тыс

15 августа 2026 года контракт FoxMarket выпустил злоумышленнику десятки миллионов токенов, которые не были обеспечены реальными вложениями. Всё потому, что расчёт количества токенов и фактическое изменение цены произошли в разные моменты одной и той же транзакции — и контракт не заметил противоречия.
Введение
FoxMarket — протокол на BNB Smart Chain, предлагающий механику облигаций. Облигация в данном контексте — это инструмент, при котором пользователь вносит активы и получает взамен токены FOX по расчётной цене. Количество выдаваемых токенов зависит от текущей рыночной цены FOX: чем дороже токен — тем меньше FOX выдаётся за ту же сумму, и наоборот.
Цену FOX контракт брал напрямую из пула FOX/USDT на PancakeSwap. Это и стало ключевой уязвимостью.
Ход инцидента
1️⃣ Флэш-лоан на крупную сумму. Злоумышленник взял мгновенный кредит — флэш-лоан, который берётся и возвращается в рамках одной транзакции без залога. Сумма займа позволила провести масштабную операцию с пулом.
2️⃣ Расчёт токенов по «старой» цене. В начале операции контракт FoxMarket снял текущую цену FOX из пула и рассчитал, сколько токенов выдать злоумышленнику. Это значение было зафиксировано внутри транзакции.
3️⃣ Выкуп почти всего FOX из пула. Следующим шагом — в рамках той же транзакции — контракт направил около 241 млн USDT на покупку FOX в пуле FOX/USDT. Такой объём выкупил почти весь FOX из пула и радикально изменил его цену и соотношение активов. FOX резко подорожал.
4️⃣ Выпуск токенов по старому расчёту. Но расчёт количества выдаваемых FOX уже был зафиксирован — по цене до операции. Контракт не пересчитал его после того, как цена изменилась. В итоге система выпустила около 91,3 млн FOX и 88,66 млн sFOX (стейкинговая версия FOX — токен, представляющий заблокированную в стейкинге позицию) — значительно больше, чем реально обеспечивал фактический вклад.
5️⃣ Продажа вознаграждения. Дополнительно злоумышленник получил около 2,66 млн FOX в виде 3% вознаграждения, предусмотренного механикой протокола. Значительная часть этих токенов была тут же продана обратно за BSC-USD — стейблкоин в сети BNB Smart Chain.
Почему это стало возможным
Здесь две взаимосвязанные ошибки.
Первая: использование спотовой цены. Контракт брал цену FOX из пула в моменте — без усреднения за период времени (TWAP). Спотовую цену можно изменить в рамках одной транзакции с помощью крупной покупки или продажи. Надёжная альтернатива — TWAP (Time-Weighted Average Price): средняя цена за промежуток времени, которую невозможно существенно сдвинуть одной операцией.
Вторая: расчёт не обновлялся после изменения состояния пула. Контракт зафиксировал расчётное количество токенов до крупной операции — и не пересчитал его после того, как эта операция кардинально изменила цену. По сути, система «не заметила», что между расчётом и выпуском токенов произошло событие, полностью меняющее картину.
В совокупности это создало ситуацию, при которой выпуск токенов был рассчитан по одной цене, а реальные операции происходили совсем по другой.
Детали расследования: движение средств
После получения прибыли в виде BSC-USD средства прошли через цепочку промежуточных адресов и осели на адресе 0x005806c04Ec29fE0740eb508c5F431C230B031e2.
На момент расследования средства остаются на этом адресе без движения.
Транзакция атаки: 0x8e1775cbfd44db29744cc6687ff1822d2c47321de6e94062f789ad6181ad5514
Заключение
Атака на FoxMarket — ещё один пример манипуляции спотовой ценой в сочетании с логической ошибкой в порядке операций. Контракт рассчитал выпуск токенов по одной цене — и не предусмотрел, что в рамках той же транзакции эта цена может быть многократно изменена.
Примечательно, что все похищенные средства — около $119 тыс. в BSC-USD — по-прежнему лежат на известном адресе без каких-либо попыток вывода или анонимизации. Это нетипично и потенциально создаёт возможность для реагирования.


