В момент перехода eth на PoS в середине сентября, появился минимум один форк: ETHW.
Часть майнеров отказалась принимать большое обновление и их цепочка блоков отделилась от оригинального еth. Тоесть все транзакции до блока Х связаны с eth сетью, но после блока X баланс пользователей раздвоился. Если у пользователя было 1eth,100dai, то такой баланс будет в сетях ETH,ETHW.
И в первые часы существовало много арбитражных возможностей в форкнутой сети.
Например, оракл chainlink, который раз в несколько минут обновляет рыночную цену eth(нативного токена) перестал обновляться в сети ethw. Следовательно, aave и другие landing протоколы не могут корретно соотносить ценность займа и залога.
Более практичный пример, правда когда его проверял, вся ликвидность на aave уже выжата:
1. 1ethw в «реальном» мире стоил 14$, у CEX такой курс был.
2. Цена нативного токена в сети ethw от chainlink 1300$(1ethw)
3. В uniswap 1ethw=36k$
Стратегия:
1000$CEX меняем на ethw
71ethw (1000$CEX)
71*36000=2 556 000$ (ethw меняем на $ в сети ethw через uniswap)
Вносим обеспечение 2.5kk$ в aave (в сети ethw)
Так как у aave старые цены оракла, то он считает что 1ethw стоит 1300$, значит при нашем залоге в 2.5kk$ выдаст 1572ethw при 80% обеспечения.
Выводим 1572ethw на биржу, продаем по 14$, получаем 22008$CEX
Другое направление в том, чтобы нормализовать курсы обмена пар в пределах dex’ов, вероятно там есть пары, которые еще не уравновешены между собой. Задача для BR бота, с последующим выходом в ethw.
Через несколько часов после форка все токены кроме ethw стали фантиками без привязки к реальным ценам. Субъективное ощущение, что все, что позволяет получать ethw уже выжато.
Специфика подобного поиска еще в том, что никакого интерфейса нет, нужно обращаться на прямую к смарт-контрактам, а это значительно сужает порог входа.
Вероятно инициаторы форка неплохо заработали, так как хорошо понимали подобные направления.
Часть майнеров отказалась принимать большое обновление и их цепочка блоков отделилась от оригинального еth. Тоесть все транзакции до блока Х связаны с eth сетью, но после блока X баланс пользователей раздвоился. Если у пользователя было 1eth,100dai, то такой баланс будет в сетях ETH,ETHW.
И в первые часы существовало много арбитражных возможностей в форкнутой сети.
Например, оракл chainlink, который раз в несколько минут обновляет рыночную цену eth(нативного токена) перестал обновляться в сети ethw. Следовательно, aave и другие landing протоколы не могут корретно соотносить ценность займа и залога.
Более практичный пример, правда когда его проверял, вся ликвидность на aave уже выжата:
1. 1ethw в «реальном» мире стоил 14$, у CEX такой курс был.
2. Цена нативного токена в сети ethw от chainlink 1300$(1ethw)
3. В uniswap 1ethw=36k$
Стратегия:
1000$CEX меняем на ethw
71ethw (1000$CEX)
71*36000=2 556 000$ (ethw меняем на $ в сети ethw через uniswap)
Вносим обеспечение 2.5kk$ в aave (в сети ethw)
Так как у aave старые цены оракла, то он считает что 1ethw стоит 1300$, значит при нашем залоге в 2.5kk$ выдаст 1572ethw при 80% обеспечения.
Выводим 1572ethw на биржу, продаем по 14$, получаем 22008$CEX
Другое направление в том, чтобы нормализовать курсы обмена пар в пределах dex’ов, вероятно там есть пары, которые еще не уравновешены между собой. Задача для BR бота, с последующим выходом в ethw.
Через несколько часов после форка все токены кроме ethw стали фантиками без привязки к реальным ценам. Субъективное ощущение, что все, что позволяет получать ethw уже выжато.
Специфика подобного поиска еще в том, что никакого интерфейса нет, нужно обращаться на прямую к смарт-контрактам, а это значительно сужает порог входа.
Вероятно инициаторы форка неплохо заработали, так как хорошо понимали подобные направления.
#GETH
EstimageGas метод использует тот же инструментарий что и во время создания блоков. Только применятся меньше правил.
Общие моменты:
- берут состояние state на запрошенный блок Х
- подготавливают EVM контекст для исполнения транзакций
Разные моменты:
- EstimateGas ограничивается исполнением транзакции и взятием только GasUsed (/internal/ethapi/api.go:1056
- Во время создания блока исполняются все транзакции и формируется их receipt с сохранением нового состояния state. (Копать от core/state_processor.go:95
В теории возможно производить симуляцию своих транзакций *без signTransaction* и получать tx.Logs и прочие детали будто транзакция смайнена.
EstimageGas метод использует тот же инструментарий что и во время создания блоков. Только применятся меньше правил.
Общие моменты:
- берут состояние state на запрошенный блок Х
- подготавливают EVM контекст для исполнения транзакций
Разные моменты:
- EstimateGas ограничивается исполнением транзакции и взятием только GasUsed (/internal/ethapi/api.go:1056
DoEstimateGas
)- Во время создания блока исполняются все транзакции и формируется их receipt с сохранением нового состояния state. (Копать от core/state_processor.go:95
applyTransaction
)В теории возможно производить симуляцию своих транзакций *без signTransaction* и получать tx.Logs и прочие детали будто транзакция смайнена.
Давно научился ускорять процесс обработки однотипных строк процесс с помощью sublime text 3.
Основная идея в том, что вместо одного мигающего веделения, так называемой вертикальной палочки, можно сделать их несколько и писать с помощью этого в нескольких местах одну команду
Например, есть список
Нужно добавить в начало строки 'http://'
// cmd(mac) = ctrl(windows)
1. Выделить
2.a Eсли строк несколько десятков:
2.b Если строк много, то
3.
4. Написать 'http://'
Схожим образом можно заменить
Cделать все в одну строку:
1.
2. Убедиться что включен поиск по regexpr (слева от окна поиска кнопка ‘.*’)
3.
4.
Для более сложных паттернов есть с регулярные выражения (regexpr).
Основная идея в том, что вместо одного мигающего веделения, так называемой вертикальной палочки, можно сделать их несколько и писать с помощью этого в нескольких местах одну команду
Например, есть список
ip1:port1
ip2:port2
...
Нужно добавить в начало строки 'http://'
// cmd(mac) = ctrl(windows)
1. Выделить
:
2.a Eсли строк несколько десятков:
cmd+D
столько раз, сколько :
подряд нужно выделить.2.b Если строк много, то
cmd+C
(скопировать ':'), cmd+F
, cmd+V
, ’Find all’
. Выделятся все ':'3.
cmd+Home
, чтобы перейти всеми выделениями максимально влево строки. Тут нужно поиграться с тем, как передвигать выделения в начало/конец строки, влево/вправо на слово. cmd
,option
,ctrl
,alt
,стрелочки
,pgUp
,pgDown
,end
.4. Написать 'http://'
Схожим образом можно заменить
.
на ,
чтобы правильно импортировались числа в таблицу.Cделать все в одну строку:
1.
cmd+F
, \n
2. Убедиться что включен поиск по regexpr (слева от окна поиска кнопка ‘.*’)
3.
Find All
4.
del
, пробел
Для более сложных паттернов есть с регулярные выражения (regexpr).
Головоломка, почему адрес неконтракта принимает usdt, когда to=0xdAC17F958D2ee523a2206206994597C13D831ec7 (не контракт в сети bsc)
https://bscscan.com/tx/0x3ace52daa2e58ac03d45443cd593b9343b55473410e06d28e9685bcfed007223
https://bscscan.com/tx/0x3ace52daa2e58ac03d45443cd593b9343b55473410e06d28e9685bcfed007223
#FULLNODE
Для запуска eth full node нужно минимум 650гб nvme
+14gb в неделю на хранение блоков/транзакций и тд, всего, что можно удалить через prune-state
По этому гайду все запустилось меньше чем за 24 часа.
Правда есть особенность, prysm’y нужно дать доверенный источник, чтобы быстрее пошла синхронизация. Без = 20 блоков в секунду. С = 50+ блоков в секунду.
Пример запуска prysm+geth
Для ускорения синхронизации:
Выбрать ссылку отсюда
Для запуска eth full node нужно минимум 650гб nvme
+14gb в неделю на хранение блоков/транзакций и тд, всего, что можно удалить через prune-state
По этому гайду все запустилось меньше чем за 24 часа.
Правда есть особенность, prysm’y нужно дать доверенный источник, чтобы быстрее пошла синхронизация. Без = 20 блоков в секунду. С = 50+ блоков в секунду.
Пример запуска prysm+geth
Для ускорения синхронизации:
./prysm/prysm.sh beacon-chain --execution-endpoint=$HOME/.ethereum/geth.ipc --block-batch-limit 1024 --checkpoint-block 15815920 --checkpoint-sync-url https://beaconstate.ethstaker.cc
Выбрать ссылку отсюда
#FULLNODE
Существует способ запустить bsc full node и занять от 350гб (сам state) с помощью снапшота от bnb48
официальный снапшот
bnb48 снапшот (Скорость скачивания получалась 400Мб/с), на весь запуск потребовалась пара часов
В общих чертах нужно:
- Запустить скачивание и разархивирование снапшота одной командой
- Скачать/скомпилировать geth и его mainnet.toml
- На основе команды запуска geth от bnb48, обновить datadir и запустить.
Существует способ запустить bsc full node и занять от 350гб (сам state) с помощью снапшота от bnb48
официальный снапшот
bnb48 снапшот (Скорость скачивания получалась 400Мб/с), на весь запуск потребовалась пара часов
В общих чертах нужно:
- Запустить скачивание и разархивирование снапшота одной командой
- Скачать/скомпилировать geth и его mainnet.toml
- На основе команды запуска geth от bnb48, обновить datadir и запустить.
#DEFI
Как мы все знаем, в bsc минимальный gasPrice = 5gwei.
Но отдельный валидатор, если захочет, может принимать транзакции с 1gwei.
Идея в том, что пользователю нужно купить токен 1KOGE=11$.
1KOGE = 240000 gasLimit максимум.
Рост gasLimit от количества koge нелинейный, детали в офф чате.
Имея 1koge и установив их rpc link можно отправлять сколько угодно транзакций с 1gwei и до 240000gasLimit.
Пост-релиз в офф чате
Как мы все знаем, в bsc минимальный gasPrice = 5gwei.
Но отдельный валидатор, если захочет, может принимать транзакции с 1gwei.
Идея в том, что пользователю нужно купить токен 1KOGE=11$.
1KOGE = 240000 gasLimit максимум.
Рост gasLimit от количества koge нелинейный, детали в офф чате.
Имея 1koge и установив их rpc link можно отправлять сколько угодно транзакций с 1gwei и до 240000gasLimit.
Пост-релиз в офф чате
InVM - изнутри о Web3
#GETH EstimageGas метод использует тот же инструментарий что и во время создания блоков. Только применятся меньше правил. Общие моменты: - берут состояние state на запрошенный блок Х - подготавливают EVM контекст для исполнения транзакций Разные моменты:…
#GETH #FLASHBOTS
Перед отправкой бандла в flashbots, нужно произвести симуляцию бандла и убедиться что все транзакции будут исполнены без ошибок. Пример
Внутри это устроено так, что запущен форк geth под названием mev-geth внутри которого есть среди прочего метод симуляции бандла eth_callBundle, который последовательно виртуально исполняет транзакции, давая максимально реалистичный ответ, если бы тоже самое выполнить в mainnet без конкуренции.
Что нужно сделать, чтобы получить аналогичный метод симуляции в собстенной ноде geth?
- Простой ответ: запустить mev-geth и подружить с консенсус-клиентом
- Сложный ответ: нужно зарегистрировать кастомный namespace и дополнить внутренние методы.
По шагам:
1. В GetAPIs нужно передавать два аргумента, и тут
2. Регистрируем свой api-namespace с префиксом eth_ и добавляем прием двух аргументов
3. Определяем апи метод CallBundle
4. Дополнить внутренние методы исполнения транзакций, чтобы получать еще и receipt. Раз, Два
Думаю, что blocknative взял за основу callBundle и предлагает 300 симуляций (Simulations, Simulation Bundle Size) за всего-лишь 100$/mo
Перед отправкой бандла в flashbots, нужно произвести симуляцию бандла и убедиться что все транзакции будут исполнены без ошибок. Пример
Внутри это устроено так, что запущен форк geth под названием mev-geth внутри которого есть среди прочего метод симуляции бандла eth_callBundle, который последовательно виртуально исполняет транзакции, давая максимально реалистичный ответ, если бы тоже самое выполнить в mainnet без конкуренции.
Что нужно сделать, чтобы получить аналогичный метод симуляции в собстенной ноде geth?
- Простой ответ: запустить mev-geth и подружить с консенсус-клиентом
- Сложный ответ: нужно зарегистрировать кастомный namespace и дополнить внутренние методы.
По шагам:
1. В GetAPIs нужно передавать два аргумента, и тут
2. Регистрируем свой api-namespace с префиксом eth_ и добавляем прием двух аргументов
3. Определяем апи метод CallBundle
4. Дополнить внутренние методы исполнения транзакций, чтобы получать еще и receipt. Раз, Два
Думаю, что blocknative взял за основу callBundle и предлагает 300 симуляций (Simulations, Simulation Bundle Size) за всего-лишь 100$/mo
InVM - изнутри о Web3
#HACK Вероятный вектор обхода блокировки на продажу до роста цены: Контекст: 1. Так как пара токена добавлена в исключения, она всегда отправляет мгновенно, потому что все пользователи могут покупать много раз (пара отправляет токены к пользователю) 2. Как…
Сейчас идет спам-рассылка что нужно срочно покупать sui(bsc) убийца aptos’a в первые часы иксы все дела.
Но продать никто кроме админов не сможет.
И находятся люди, кто покупает: https://dexscreener.com/bsc/0xa71832bc3743e7453317a714ddfcfb0383e5f688 , не ловите FOMO)
На втором фото,
Но продать никто кроме админов не сможет.
И находятся люди, кто покупает: https://dexscreener.com/bsc/0xa71832bc3743e7453317a714ddfcfb0383e5f688 , не ловите FOMO)
На втором фото,
if _to == unknown…
это проверка на то, чтобы не позволять указать получателя pancakeswap.pair с ликвидностью sui*-busd. Покупать можно без проблем этот скам, но продать нельзяЕсть способ визуализации занимаемого пространста на накопителе в виде кубиков разного размера, соотвествующих размеру файла, а цвет - директории.
Если где-то затеряется файл на сотни GB, и про него уже все забыли, то так его можно обнаружить и удалить))
Для macos grandperspective
Для windows WinDirStat, SpaceSniffer
Если где-то затеряется файл на сотни GB, и про него уже все забыли, то так его можно обнаружить и удалить))
Для macos grandperspective
Для windows WinDirStat, SpaceSniffer
#FLASHBOTS
Для polygon тоже есть аналог flashbots, со свом mev-bor. Cделала команда marlin (которые больше, чем BDN bloxroute).
На этом хорошие новости закончились, потому что единственный валидатор 0x88c5e96c1459d224383dcb1fe0cedd1fcee25ffb создает блоки очень редко, например:
15 часов назад
11 дней назад
15 дней назад
17 дней назад
И это для сети, где блок создается раз в 2 секунды.
Если еще не передумали отправлять бандл в полигоне, то вот в помощь:
1. Убедиться, что валидатор сейчас валидирует блоки, а не неделю назад 0x88c5e96c1459d224383dcb1fe0cedd1fcee25ffb
2. С помощью контракта можно отправлять чаевые, не зная валидатора (как у flashbots подход) 0x0b787209ecb980e444babce86e980162288fafc3
3. eth_callBundle (симуляция бандла) возможна только на своей ноде mev-bor
4. Пример кода и доки marlin
5. Пример кода, с помощью которого получилось смайнить бандл 15 часов назад))
Upd: у валидатора низкий стейк, поэтому редко выигрывает аукцион на создание блоков
Для polygon тоже есть аналог flashbots, со свом mev-bor. Cделала команда marlin (которые больше, чем BDN bloxroute).
На этом хорошие новости закончились, потому что единственный валидатор 0x88c5e96c1459d224383dcb1fe0cedd1fcee25ffb создает блоки очень редко, например:
15 часов назад
11 дней назад
15 дней назад
17 дней назад
И это для сети, где блок создается раз в 2 секунды.
Если еще не передумали отправлять бандл в полигоне, то вот в помощь:
1. Убедиться, что валидатор сейчас валидирует блоки, а не неделю назад 0x88c5e96c1459d224383dcb1fe0cedd1fcee25ffb
2. С помощью контракта можно отправлять чаевые, не зная валидатора (как у flashbots подход) 0x0b787209ecb980e444babce86e980162288fafc3
3. eth_callBundle (симуляция бандла) возможна только на своей ноде mev-bor
4. Пример кода и доки marlin
5. Пример кода, с помощью которого получилось смайнить бандл 15 часов назад))
Upd: у валидатора низкий стейк, поэтому редко выигрывает аукцион на создание блоков
Недавно 1inch представили подход, чтобы обезопасить обмены пользователей от оборачивания потенциально уязвимых транзакций обменов для frontrun/backrun через flashbots для ethereum.
bloxroute (eth/bsc BDN) представили аналог, только для любых транзакций. Если отправлять транзакции через их rpc url, тогда транзакции не попадают в публичный мемпул. Дополнительная опция в том, что если вдруг транзакция обмена выгодна для ботов, то эти боты должны поделиться профитом с кошельком, который обмен инициировал https://t.me/bloXrouteLabsCommunity/28893
bloxroute (eth/bsc BDN) представили аналог, только для любых транзакций. Если отправлять транзакции через их rpc url, тогда транзакции не попадают в публичный мемпул. Дополнительная опция в том, что если вдруг транзакция обмена выгодна для ботов, то эти боты должны поделиться профитом с кошельком, который обмен инициировал https://t.me/bloXrouteLabsCommunity/28893
#EVM
В контракте роутера 1inch заложен функционал, что любой может вывести токены, которые по ошибке отправлены роутеру.
Это замечательная практика, чтобы не превращать фантики в мертвые фантики, отправленные по ошибке, которые будут лежать на адресе до скончания времен.
Думаю было бы хорошей практикой сделать что-то вроде «если с контрактом не взаимодействую дольше 2х лет по timestamp, то разрешить его удаление (selfdestruct) и вывод всех erc20 токенов инициатору». При массовом внедрении это позволит сократить размер node state.
Например, в bsc есть 25кк контрактов.
15кк из них удалено (bytecode = 0x)
10кк живые, но большинство неактивны.
Размер bsc ноды по bnb48 около 350гб, full node займет больше 1тб.
В контракте роутера 1inch заложен функционал, что любой может вывести токены, которые по ошибке отправлены роутеру.
Это замечательная практика, чтобы не превращать фантики в мертвые фантики, отправленные по ошибке, которые будут лежать на адресе до скончания времен.
Думаю было бы хорошей практикой сделать что-то вроде «если с контрактом не взаимодействую дольше 2х лет по timestamp, то разрешить его удаление (selfdestruct) и вывод всех erc20 токенов инициатору». При массовом внедрении это позволит сократить размер node state.
Например, в bsc есть 25кк контрактов.
15кк из них удалено (bytecode = 0x)
10кк живые, но большинство неактивны.
Размер bsc ноды по bnb48 около 350гб, full node займет больше 1тб.
InVM - изнутри о Web3
#EVM В контракте роутера 1inch заложен функционал, что любой может вывести токены, которые по ошибке отправлены роутеру. Это замечательная практика, чтобы не превращать фантики в мертвые фантики, отправленные по ошибке, которые будут лежать на адресе до…
Вот пример, никто не может вывести 56к$usdt, потому что в логику контракта не заложено, благо здесь прокси контракт и в перспективе админы могут обновить implementation и вывести себе))
InVM - изнутри о Web3
#EVM В контракте роутера 1inch заложен функционал, что любой может вывести токены, которые по ошибке отправлены роутеру. Это замечательная практика, чтобы не превращать фантики в мертвые фантики, отправленные по ошибке, которые будут лежать на адресе до…
Подсказки:
1. Адрес 1inch router v2
2. Пример транзакции вывода токенов
3. По моим данным там лежит целых 6$, но нужно обернуть в flashbots bundle
1. Адрес 1inch router v2
2. Пример транзакции вывода токенов
3. По моим данным там лежит целых 6$, но нужно обернуть в flashbots bundle
#HACK
Frontrun боты видят многое, но не все. По следам поста, которому больше 2х лет, попробовал свои силы, чтобы перехитрить ботов.
Общий алгоритм:
1. Создать максимально безопасный токен для трейда
2. Создать пару с ликвидностью
3. Совершать обмены с огромным slippage
4. Сделать так, чтобы бот думал что он выйдет в плюс, но на деле он или не видит или не успеет отменить свои транзакции.
После очередной проверки гипотезы, которым счет идет на десятки, удачно сложилась гипотеза+распространение транзакций, и бот не увидел подвоха
Фото 1. Бот покупает токен JH (в паре +80$bnb)
Фото 2. Моя транзакция обычного свапа с огромным slippage (условно amountOutMin=1). В худшем случае дарю боту 13$bnb.
Фото 3. Бот продает все JH и получает лишь 9$bnb (так как предоставляю ликвидность в пару только я, значит +90$ ко мне)
Под капотом бот не увидел моей второй, но первой транзакции, которая включила комиссии для всех не админов токена в 90% комиссии.
Жду вашей реакции, чтобы показать обратную сторону маленькой победы)
Frontrun боты видят многое, но не все. По следам поста, которому больше 2х лет, попробовал свои силы, чтобы перехитрить ботов.
Общий алгоритм:
1. Создать максимально безопасный токен для трейда
2. Создать пару с ликвидностью
3. Совершать обмены с огромным slippage
4. Сделать так, чтобы бот думал что он выйдет в плюс, но на деле он или не видит или не успеет отменить свои транзакции.
После очередной проверки гипотезы, которым счет идет на десятки, удачно сложилась гипотеза+распространение транзакций, и бот не увидел подвоха
Фото 1. Бот покупает токен JH (в паре +80$bnb)
Фото 2. Моя транзакция обычного свапа с огромным slippage (условно amountOutMin=1). В худшем случае дарю боту 13$bnb.
Фото 3. Бот продает все JH и получает лишь 9$bnb (так как предоставляю ликвидность в пару только я, значит +90$ ко мне)
Под капотом бот не увидел моей второй, но первой транзакции, которая включила комиссии для всех не админов токена в 90% комиссии.
Жду вашей реакции, чтобы показать обратную сторону маленькой победы)
InVM - изнутри о Web3
#HACK Frontrun боты видят многое, но не все. По следам поста, которому больше 2х лет, попробовал свои силы, чтобы перехитрить ботов. Общий алгоритм: 1. Создать максимально безопасный токен для трейда 2. Создать пару с ликвидностью 3. Совершать обмены с огромным…
#HACK 1/2
Чтобы заинтересовать frontrun ботов, нужно:
- Отправить транзакцию обмена через публичный мемпул
- Подобрать правильное соотношение ликвидности в паре и размеру свапа, чтобы боту было интересно. Например 30$bnb-100JH в паре, и свап на 10-15$bnb с очень низким slippage. Frontrun транзакции делают так, что пользователь обменяет токены по максимально не выгодному для пользователя курсу обмена (при slippage 99% = amountOutMin=1wei) бот 'заберет' все $bnb из транзакции.
- Чем объемнее ликвидность в паре, тем сложнее боту значительно влиять на цену и нужно больше капитала для этого.
- Учитывать случайность распространения транзакций по мемпулу между нодами, не каждый раз боты увидят.
- Чтобы другие транзакции публичного мемпула не испортили прибыльность боту.
Чтобы перехитрить ботов в bsc, только транзакции обмена недостаточно, они видят все, что происходит в публичном мемпуле и даже улавливают связи, что первая транзакция ок, а вторая ломает боту frontrun операции.
Чтобы заинтересовать frontrun ботов, нужно:
- Отправить транзакцию обмена через публичный мемпул
- Подобрать правильное соотношение ликвидности в паре и размеру свапа, чтобы боту было интересно. Например 30$bnb-100JH в паре, и свап на 10-15$bnb с очень низким slippage. Frontrun транзакции делают так, что пользователь обменяет токены по максимально не выгодному для пользователя курсу обмена (при slippage 99% = amountOutMin=1wei) бот 'заберет' все $bnb из транзакции.
- Чем объемнее ликвидность в паре, тем сложнее боту значительно влиять на цену и нужно больше капитала для этого.
- Учитывать случайность распространения транзакций по мемпулу между нодами, не каждый раз боты увидят.
- Чтобы другие транзакции публичного мемпула не испортили прибыльность боту.
Чтобы перехитрить ботов в bsc, только транзакции обмена недостаточно, они видят все, что происходит в публичном мемпуле и даже улавливают связи, что первая транзакция ок, а вторая ломает боту frontrun операции.