Проскальзывание на DEX: тест реальных потерь при обмене

В марте 2025 года один такой обмен закончился потерей более $714 000: трейдер отправил 732 583 USDC на USDT и получил обратно всего 18 636 USDT. Причина была не в загадочном эксплойте смарт-контракта и не в ошибке самого пула, а в критической настройке проскальзывания — 100%.
Это не экстремальный edge case, который можно списать на «сам виноват, кит». Та же механика работает на обычных свапах, когда интерфейс предлагает слишком широкий допуск, пользователь не смотрит на price impact, а бот видит в мемпуле сделку с гарантированной маржой. Проскальзывание на DEX-биржах — не декоративный процент рядом с кнопкой обмена, а фактически лимит того, сколько стоимости вы готовы отдать поисковику MEV за право провести вашу транзакцию первой.
Механика проскальзывания: Price Impact — не Slippage
В интерфейсе DEX эти параметры часто стоят рядом, поэтому их регулярно смешивают. На уровне исполнения это разные вещи.
Price Impact показывает, насколько сама ваша сделка сдвигает цену внутри пула. Если в пуле лежит немного ликвидности, а вы пытаетесь обменять крупный объём, кривая Automated Market Maker (AMM) начнёт двигаться против вас ещё до учёта внешних изменений рынка. Это свойство конкретного пула и размера сделки. Оно известно в момент расчёта маршрута.
Slippage — фактическое отклонение цены исполнения от ожидаемой. Пока транзакция ждёт включения в блок, состояние пула может измениться: кто-то купил актив перед вами, арбитражник переставил ликвидность, другой пользователь вывел средства из диапазона Uniswap v3, а MEV-бот специально протолкнул две свои операции вокруг вашей.
Упрощённо:
- price impact — ущерб от размера вашей сделки относительно доступной ликвидности;
- slippage — допуск на изменение условий между расчётом и исполнением;
- MEV — возможность извлечь дополнительную стоимость из порядка транзакций;
- сэндвич-атака — частный случай MEV, в котором вашу сделку зажимают между покупкой и продажей бота.
Если обмен рассчитан на получение 100 ETH, а интерфейс показывает price impact 4%, это не означает, что ещё 4% можно бездумно добавлять в slippage. Вы уже платите за прохождение по кривой пула. Допуск проскальзывания нужен только для того, чтобы транзакция не стала недействительной из-за изменения состояния до исполнения.
Price impact — это цена прохождения через ликвидность. Slippage — окно, которое вы оставляете между расчётом и фактическим исполнением. MEV-боту нужен именно второй параметр.
На практике пользователь видит только финальную цифру: сколько токенов он получит минимум. Смарт-контракт получает более формальное ограничение — amountOutMin, то есть минимальный объём выходного токена, который допустим для исполнения. Если фактический результат окажется ниже порога, транзакция должна завершиться revert. Но если порог выставлен слишком низко, контракт честно выполнит обмен на условиях, которые для человека выглядят как финансовая катастрофа.
Почему большой swap особенно уязвим
В Uniswap v2-подобных пулах цена определяется соотношением резервов. В v3 ликвидность распределена по ценовым диапазонам, и это делает картину ещё менее линейной: крупный обмен может последовательно пройти через несколько тиков, где плотность ликвидности резко меняется. На экране может быть приемлемый средний курс, но отдельный участок маршрута окажется практически пустым.
Агрегатор способен разделить сделку между несколькими пулами и сетями, однако это не превращает маршрут в бронекапсулу. Каждый дополнительный hop добавляет:
- ещё один вызов смарт-контракта;
- новые места для изменения состояния;
- дополнительные комиссии и газ;
- зависимость от корректности роутера и оракульной логики;
- более сложный профиль для симуляции и защиты.
Для маленькой сделки на глубоком пуле разница между ожидаемым и фактическим исполнением может быть микроскопической. Для крупного swap в паре со стейблкоинами, где трейдер считает «USDC в USDT — это почти одно и то же», риск часто недооценивают. Номинальная волатильность активов низкая, но ликвидность и порядок транзакций могут сделать результат крайне нестабильным.
Как сэндвич-атака превращает допуск в добычу
MEV-бот не обязан взламывать протокол. Он наблюдает за неподтверждёнными транзакциями, оценивает их потенциальную прибыль и пытается изменить порядок исполнения. В публичном мемпуле это выглядит примерно так:
1. Бот видит ваш swap и определяет, сколько вы хотите купить или продать.
2. Он отправляет собственную транзакцию с более привлекательной комиссией или через приватный канал доставки.
3. Эта операция исполняется перед вашей и двигает цену в невыгодную для вас сторону.
4. Ваша транзакция проходит по уже изменившемуся курсу, если он всё ещё укладывается в установленный slippage.
5. Бот закрывает позицию следующей транзакцией и забирает разницу.
В AMM-пуле бот обычно покупает актив перед крупным swap пользователя, поднимая его цену, затем продаёт после исполнения пользовательской сделки. Вы теряете не потому, что контракт неправильно посчитал формулу, а потому, что дали рынку разрешение исполнить обмен в слишком широком диапазоне.
Валидатор или блок-билдер получает за включение выгодного порядка транзакций tip. В одном из инцидентов марта 2025 года MEV-бот заплатил $200 000 валидатору bobTheBuilder, чтобы провести атаку вокруг обмена на $220 764. В итоге трейдер потерял около $215 000. Это хорошо показывает экономику атаки: пока потенциальная добыча выше газа, взятки и операционных расходов, бот будет считать транзакцию не пользовательской активностью, а заявкой на ликвидность.
Что именно проверяет бот
Условный поисковик MEV не бросается на каждую транзакцию с slippage выше 1%. Атака имеет смысл только при положительном ожидаемом результате. В расчёт входят:
- объём сделки и её влияние на резервы;
- доступная ликвидность непосредственно перед swap;
- значение
amountOutMin; - стоимость газа;
- конкуренция между ботами;
- вероятность включения нужного порядка;
- размер чаевых валидатору или блок-билдеру;
- возможность быстро закрыть позицию после вашей операции.
Поэтому фиксированное правило «ставьте всегда 0,5%» не работает. Для одного пула это может быть избыточно, для другого — недостаточно даже для нормального исполнения. Более того, одинаковый процент на разных сетях означает разные финансовые последствия: на Ethereum неудачная транзакция в период перегрузки способна стоить от $5 до $50 и более только за газ, тогда как на дешёвой L2 цена ошибки будет другой, но не обязательно нулевой.
Сэндвич-атака — не единственный источник расхождения. Пока транзакция находится в очереди, обычный арбитраж может изменить цену, крупный LP может переместить ликвидность, а другой обмен по тому же маршруту может съесть лучший диапазон. Защита от MEV и защита от естественного движения рынка пересекаются, но не совпадают.
Хроника двух потерь: когда 100% превращается в разрешение на слив
Самый показательный кейс марта 2025 года связан с обменом 732 583 USDC на USDT через Uniswap v3. Трейдер установил проскальзывание на уровне 100%, используя старый роутер. На практике это означало: контракту почти всё равно, сколько USDT выдавать на выходе, пока операция формально соответствует маршруту и не нарушает другие ограничения.
После атаки пользователь получил 18 636 USDT. Потеря превысила $714 000.
Важно не перепутать две причины:
- старый роутер сам по себе не обязательно был уязвимым смарт-контрактом;
- критическим фактором стала комбинация огромного объёма и практически безлимитного допуска;
- бот не «украл средства с кошелька» в смысле несанкционированного transfer;
- трейдер подписал разрешённый вызов, который отдал активы по условиям, допускаемым параметром сделки.
Для блокчейна это валидная транзакция. Для трейдера — разница между обменом стейблкоинов и потерей капитала.
Второй инцидент выглядел похожим: обмен на $220 764 завершился потерей примерно $215 000. Здесь особенно хорошо виден механизм аукциона за порядок транзакций: бот заплатил $200 000 за включение нужной последовательности. Это не случайная ошибка котировки и не «глюк интерфейса», а конкурентный рынок за право первым занять место в блоке.
| Параметр | Инцидент на $714 000 | Инцидент на $215 000 |
|---|---|---|
| Направление обмена | 732 583 USDC → USDT | 220 764 USDC → USDT |
| Примерный ущерб | Более $714 000 | Около $215 000 |
| Ключевой фактор | Slippage 100%, старый роутер | Сэндвич-атака и приоритетное включение |
| Полученный результат | 18 636 USDT | Существенная часть суммы потеряна |
| Вознаграждение за порядок транзакций | Не раскрыто в приведённом кейсе | $200 000 валидатору |
| Тип ошибки | Безлимитный допуск на отклонение | Широкое окно для MEV-исполнения |
Оба случая неприятны именно своей технической обыденностью. Здесь не потребовался баг в математике Uniswap v3, подмена интерфейса или компрометация приватного ключа. Достаточно было разрешить исполнение сделки в условиях, при которых экономическая модель пользователя и экономическая модель бота полностью разошлись.
Эффект дефолта: интерфейс тоже участвует в риске
Большинство пользователей не открывает расширенные параметры перед каждым swap. Они нажимают на маршрут, смотрят на итоговую сумму и подтверждают транзакцию кошельком. Это нормальное поведение, на котором и держится UX DeFi, но у него есть обратная сторона: значение, предложенное интерфейсом, становится фактической стратегией риска.
По данным, собранным по операциям DEX, 24% транзакций на Uniswap и 67% на Sushiswap выполнялись с настройками проскальзывания по умолчанию. Для массового пользователя «default» выглядит как нейтральный выбор, хотя в реальности это заранее выбранный компромисс между вероятностью исполнения и размером потенциальной потери.
Статическое значение 0,5% долго использовалось как типовой вариант на DEX, включая Sushiswap и PancakeSwap. Для спокойного глубокого пула такой допуск может быть приемлемым. Но если транзакция крупная, актив волатильный, ликвидность разрежена по диапазонам, а блокчейн перегружен, универсальный процент начинает работать против пользователя.
Uniswap перешёл к динамическому расчёту проскальзывания 16 марта 2023 года, используя диапазон от 0,1% до 5% вместо единого фиксированного значения. После этого общие потери трейдеров от сэндвич-атак снизились на 54,7%, а среди пользователей, которые оставили настройки по умолчанию, снижение достигло 90%.
Это не означает, что динамический slippage делает swap безопасным автоматически. Он лишь лучше связывает допуск с текущими условиями: волатильностью, ликвидностью и характером сделки. Проблема в том, что алгоритм интерфейса не видит всего, что видит ваш риск-профиль. Он может оценить маршрут, но не знает, готовы ли вы потерять 2% ради гарантированного исполнения или лучше получить revert и заплатить газ.
Дефолт — это не отсутствие решения. Это решение, принятое за вас, причём обычно в пользу более высокой вероятности исполнения.
За март 2023 года потери на Uniswap и Sushiswap от сэндвич-атак составили $16 584 438. В масштабе всей DeFi-экосистемы ежегодный ущерб от атак, эксплуатирующих slippage, оценивается более чем в $100 млн. Эти цифры не доказывают, что каждый широкий допуск будет атакован, но показывают размер рынка, на котором боты уже давно работают не как случайные скрипты, а как специализированная инфраструктура.
Где проходит рабочий баланс: отмена против защиты
Слишком низкий slippage тоже не является бесплатной защитой. Если выставить 0% для сделки, которая не может исполниться строго по расчётной цене, транзакция завершится ошибкой. Средства обмена не должны быть списаны, но газ уже потрачен и не возвращается. На Ethereum при высокой загрузке это может быть от $5 до $50 и более за одну неудачную попытку.
Допуск 0,1–0,3% для волатильного актива выглядит дисциплинированно, но на быстро движущемся рынке способен превращать каждую попытку в платный revert. Особенно быстро такой режим ломается при маршруте с несколькими пулами: итоговый курс должен одновременно уложиться в ограничения всех промежуточных переходов, а состояние хотя бы одного пула может измениться до включения блока.
С другой стороны, 3–5% на ликвидной паре стейблкоинов — это уже не «запас на рыночный шум», а потенциально широкая дверь для sandwich execution. Если price impact до отправки уже составляет 2%, добавление ещё 5% slippage означает, что вы допускаете совокупное ухудшение условий, которое может быть неприемлемым даже без атаки.
Практический тест настройки лучше проводить не по одной цифре, а по четырём параметрам:
- Размер сделки относительно ликвидности. Считайте не только TVL пула, но и фактическую ликвидность в нужном ценовом диапазоне. Миллионы долларов общей ликвидности не спасают, если в текущем тике её мало.
- Price impact до подтверждения. Высокое значение уже говорит, что вы сами двигаете цену. Slippage не исправит плохую глубину пула.
- Время нахождения транзакции в очереди. Чем дольше операция ждёт блок, тем больше окно для изменения состояния и MEV-реакции.
- Тип маршрута. Прямой обмен через один глубокий пул проще оценить, чем цепочка из нескольких hop через разные протоколы и мосты.
Для крупных операций разумнее дробить объём, если это не создаёт дополнительных рисков и комиссий, выбирать более глубокий маршрут и не отправлять транзакцию с широким допуском в публичный мемпул. Приватная доставка транзакций или специализированный RPC могут уменьшить видимость заявки для части MEV-инфраструктуры, но не дают абсолютной гарантии: защита зависит от конкретной сети, провайдера и способа сборки блока.
Что в настройках действительно имеет смысл
Ниже — не универсальная таблица «поставьте X% и забудьте», а карта поведения параметра.
| Сценарий | Узкое место | Что происходит при слишком низком slippage | Что происходит при слишком высоком slippage |
|---|---|---|---|
| Глубокий пул стейблкоинов | Изменение порядка транзакций | Revert при небольшом движении цены | Повышается привлекательность для sandwich-атаки |
| Волатильная пара | Быстрое движение рынка | Частые отмены и потеря газа | Swap проходит, но итоговая цена может оказаться плохой |
| Крупная сделка в тонком пуле | Price impact и нехватка ликвидности | Сделка не исполняется | Пользователь фиксирует большой убыток на кривой AMM |
| Маршрут через несколько пулов | Изменение состояния одного из hop | Revert из-за одного участка маршрута | Увеличивается суммарное окно для MEV |
| Перегруженная сеть Ethereum | Цена газа и задержка | Дорогие неудачные попытки | Долгое ожидание даёт ботам больше времени на реакцию |
Ключевой вывод для настройки криптовалюты на DEX выглядит не очень маркетингово, зато честно: slippage нужно подбирать под конкретную транзакцию, а не под бренд протокола. Даже на одном и том же Uniswap значение, приемлемое для обмена 500 USDC, может быть разрушительным для операции на сотни тысяч долларов.
Почему «поставить 0%» не является защитной стратегией
Нулевая настройка часто воспринимается как математическая броня: если цена изменится хоть на минимальную величину, транзакция откатится. Но в блокчейне revert не равен отсутствию расходов. Газ оплачивает вычисление и попытку включения операции, а не только успешный результат.
Кроме того, жёсткий лимит не решает проблему плохого маршрута. Если price impact вызван недостаточной ликвидностью, сделка просто не пройдёт. Если проблема в устаревшей котировке, она будет отменяться снова и снова. Пользователь может начать повышать допуск вручную, не меняя пул и не сокращая объём, — и перейти от серии дорогих revert к одному дорогому исполнению.
Более корректная модель выглядит так:
1. Сначала оценить, насколько сама сделка сдвигает цену.
2. Затем проверить, не слишком ли тонкий выбранный пул или диапазон ликвидности.
3. После этого определить допустимое отклонение для времени ожидания и волатильности.
4. Для крупной суммы оценить, может ли потенциальная прибыль сделать транзакцию интересной для MEV-бота.
5. Сравнить стоимость неудачной попытки с потенциальным ущербом от широкого допуска.
Если ошибка в маршруте приводит к price impact 8%, бессмысленно лечить её slippage в 0,5%. Если обмен стейблкоинов через глубокий пул показывает минимальный impact, но интерфейс предлагает 5% допуска, бессмысленно принимать это как «так настроил протокол». В обоих случаях проблема находится выше или ниже самого процента.
Неочевидные уязвимости, которые остаются после правильной цифры
Даже аккуратно выставленный slippage не превращает DEX в безопасную кнопку обмена. В сложных маршрутах остаются другие точки отказа.
Старые роутеры и разрешения токенов
Интерфейс может использовать старый роутер, устаревший контракт или неочевидную схему approval. Это не означает автоматический эксплойт, но увеличивает поверхность атаки и усложняет проверку того, какой именно контракт получает право перемещать токены. История с обменом на $714 000 показывает, что параметр сделки и версия маршрутизатора нужно рассматривать вместе.
Ложное чувство безопасности из-за стейблкоинов
USDC и USDT обычно торгуются около доллара, поэтому пользователи ожидают почти нулевой риск цены. Но стабильность номинала не гарантирует глубину конкретного пула. Де-пег, временный дисбаланс резервов, изменение ликвидности в Uniswap v3 или крупный арбитражный swap способны быстро изменить цену. Для бота это всё равно рынок, а не «безопасный обмен долларов».
Дополнительные hop и скрытая стоимость маршрута
Агрегатор может предложить лучший курс на уровне итоговой котировки, но сложный маршрут увеличивает число состояний, которые должны остаться неизменными до исполнения. Каждый hop — дополнительная точка, где может возникнуть revert или измениться цена. Комиссия протокола, комиссия пула и газ должны сравниваться с выигрышем от более выгодного курса, а не только с красивой цифрой You receive.
Оракулы не всегда участвуют там, где их ждут
Цена, показанная интерфейсом, может быть рассчитана по резервам пула и маршруту, а не подтверждена внешним оракулом. Оракул не является универсальным арбитром качества конкретного swap: он может показывать рыночную цену, пока ваш маршрут проходит по локально опустошённому пулу. И наоборот, протокол может применять собственные проверки, но они не обязательно ограничивают допустимый результат так, как ожидает пользователь.
Приватный мемпул не отменяет экономику
Приватная отправка уменьшает риск публичного фронтрана, но не устраняет price impact, ошибку маршрута, неверный approval или проблемы ликвидности. Защита от одной категории атак не должна маскироваться под аудит всей транзакции. В DeFi опасны именно такие подмены: закрыли одну дыру и решили, что весь стек теперь hardened.
Вердикт: лучший slippage — не самый низкий, а экономически обоснованный
Тест реальных потерь показывает неприятную, но полезную вещь: большинство катастрофических сценариев начинается не с экзотической уязвимости, а с неверной модели исполнения. Пользователь смотрит на курс, бот смотрит на amountOutMin, состояние пула и порядок транзакций. Пока эти три уровня не совпадают, интерфейс может показывать «обмен выполнен», хотя фактически сделка стала донорством ликвидности для MEV-инфраструктуры.
Для обычного swap на глубоком пуле динамический расчёт обычно лучше статического значения, потому что он учитывает текущую волатильность и условия маршрута. Для крупной операции приоритетом должны стать глубина ликвидности, дробление объёма, сокращение времени ожидания и приватная доставка, если она доступна в используемой сети. Для тонкого пула высокий slippage не делает сделку выгодной — он лишь позволяет ей состояться по плохой цене.
Три правила, которые действительно переживают смену интерфейса и протокола:
1. Не путайте price impact со slippage. Если пул уже двигает цену против вас, изменение допуска не исправит экономику сделки.
2. Не принимайте default как нейтральную настройку. Значение интерфейса — это готовый риск-профиль, а не гарантия честного исполнения.
3. Не оставляйте широкий допуск на крупном swap. 100% — не «максимальная вероятность успеха», а почти полное разрешение исполнить сделку по цене, которую вы не видели при подтверждении.
DeFi не обязан защищать пользователя от его собственной подписи. Смарт-контракт выполнит то, что ему разрешили, а рынок блок-продакшена найдёт наиболее прибыльный порядок исполнения. Поэтому slippage на DEX — это не мелкая настройка для опытных дегенов, а граница, за которой ваша транзакция перестаёт быть обменом по рассчитанному курсу и становится открытой заявкой для тех, кто быстрее читает мемпул.