Fragment Software
Polymarket eye 👁 👄 👁 Автоматизация регистрации аккаунтов polymarket с открытым кодом, поддерживаются следующие приколы: • Прокси • Сохранения результатов в файл • Регистрация аккаунта • Смена юзернейма • Активация прокси кошелька на аккаунте Позже добавится…
Update
Добавлены следующие приколы:
• Депозиты USDCe на прокси кошелек (USDCe CA: 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)
• Активация трейдинга на аккаунте
• Апрув токенов для трейдинга
• Перед регистрацией проверяется зарегистрирован ли уже такой кошелек, больше не нужно их сортировать
• Мониторинг ивентов, куда можно выгодно зайти (пока неактивно)
Интересно работает их relayer, но он повержен. По итогу теперь вы получаете абсолютно готовый аккаунт к использованию. Следующий апдейт уже скорее всего с зеркальными ставками7️⃣ . Код тут
Добавлены следующие приколы:
• Депозиты USDCe на прокси кошелек (USDCe CA: 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)
• Активация трейдинга на аккаунте
• Апрув токенов для трейдинга
• Перед регистрацией проверяется зарегистрирован ли уже такой кошелек, больше не нужно их сортировать
• Мониторинг ивентов, куда можно выгодно зайти (пока неактивно)
Интересно работает их relayer, но он повержен. По итогу теперь вы получаете абсолютно готовый аккаунт к использованию. Следующий апдейт уже скорее всего с зеркальными ставками
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥7
Дописываем polymarket-eye, нужно было имплементировать мультикол, это оказалось слишком приятно? 😰 , с помощью макроса
Таким образом можно их удобно энкодить:
Либо декодить:
sol!. Насколько это сильная вещь даже сложно описать словами, можно прямо из solidity исходников взять solidity структуры и подписи функций:
sol! {
#[derive(Debug)]
struct Result {
bool success;
bytes returnData;
}
#[derive(Debug)]
struct Call3 {
address target;
bool allowFailure;
bytes callData;
}
#[sol(rpc)]
contract Multicall3 {
function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData);
}
}
Таким образом можно их удобно энкодить:
let calls = addresses
.iter()
.map(|address| {
let calldata = balanceOfCall::new((*address,)).abi_encode();
Call3 {
target: token.contract_address,
allowFailure: false,
callData: calldata.into(),
}
})
.collect_vec();
Либо декодить:
let out = multicall_instance
.aggregate3(calls)
.call()
.await?
.returnData
.iter()
.zip(addresses.iter())
.map(|(balance, address)| {
let balance =
<sol! { uint256 }>::abi_decode(&balance.returnData, false).unwrap_or(U256::ZERO);
(*address, balance)
})
.collect::<HashMap<Address, U256>>();
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍4
Polymarket eye 👀
Жирнющий софт с открытым исходником для полной автоматизации действий на Polymarket.
Функционал и фичи:
• Регистрация аккаунта
• Активация прокси кошелька
• Подключение трейдинга
• Апрув токенов
• Депозит USDC.e на прокси кошелек
• Скан ивентов по фильтрам (спред и разница в цене между исходами)
• Зеркальные ставки на ивенты на случайную сумму со случайных кошельков
• Многопоточность
• Чекер статистики аккаунтов (баланс, кол-во открытых позиций)
• Мобильные прокси
На данный продукт было потрачено много сил и времени, дальше будет еще больше интересного. Буду благодарен за⭐️ на Github. По вопросам с настройкой добро пожаловать в чат.
Github с инструцией / Канал / Чат
Жирнющий софт с открытым исходником для полной автоматизации действий на Polymarket.
Функционал и фичи:
• Регистрация аккаунта
• Активация прокси кошелька
• Подключение трейдинга
• Апрув токенов
• Депозит USDC.e на прокси кошелек
• Скан ивентов по фильтрам (спред и разница в цене между исходами)
• Зеркальные ставки на ивенты на случайную сумму со случайных кошельков
• Многопоточность
• Чекер статистики аккаунтов (баланс, кол-во открытых позиций)
• Мобильные прокси
На данный продукт было потрачено много сил и времени, дальше будет еще больше интересного. Буду благодарен за
Github с инструцией / Канал / Чат
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍40🔥17🗿5
Fragment Software
Polymarket eye 👀 Жирнющий софт с открытым исходником для полной автоматизации действий на Polymarket. Функционал и фичи: • Регистрация аккаунта • Активация прокси кошелька • Подключение трейдинга • Апрув токенов • Депозит USDC.e на прокси кошелек • Скан…
Update
Изменения:
• В проверку статистики добавлены:
1. Общая ценность открытых позиций
2. Общий объем сделок
3. P&L
4. Кол-во сделок
• Фиксы багов
• Изменено условие при котором выдаются апрувы при регистрации
• Изменено условие при котором активируется прокси кошелек
Чек статы работает очень быстро. Я сделал почти все, что хотел, пишите в комментарии/dm ваши идеи, если понравится тоже добавлю😎
Изменения:
• В проверку статистики добавлены:
1. Общая ценность открытых позиций
2. Общий объем сделок
3. P&L
4. Кол-во сделок
• Фиксы багов
• Изменено условие при котором выдаются апрувы при регистрации
• Изменено условие при котором активируется прокси кошелек
Чек статы работает очень быстро. Я сделал почти все, что хотел, пишите в комментарии/dm ваши идеи, если понравится тоже добавлю
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍7🗿1
Пока рынок снова позволяет флипать щитки на солане, мы решили написать очень быстрые полностью onchain мониторы, первым из них будет монитор для новых пулов на Raydium. Следить можно в нашем отдельном форуме либо дискорде.
В планах сделать еще много других полезных моников:
• Raydium burn liquidity
• Raydium rug pools
• Pumpfun tokens
• Pumpfun bonding curve completed
• ???
И огромное множество других, будем смотреть сколько это направление еще проживет
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20
ME Airdrop Checker
Чекер дропа Magic Eden, поддерживает многопоточность, сидки/приватники, отображает аллокацию, blazing fast🍔 . Код грязный потому что рефакторить лень
Короче вообще очень крутой👍
Возможно мы будем делать антидрейн на дроп (только SOL), если на это будет спрос, dm @ch4irchad за деталями
Все инструкции по запуску находятся в README, вопросы в чатик
Канал / Чат / Fragment Monitors / Discord
Чекер дропа Magic Eden, поддерживает многопоточность, сидки/приватники, отображает аллокацию, blazing fast
Короче вообще очень крутой
Возможно мы будем делать антидрейн на дроп (только SOL), если на это будет спрос, dm @ch4irchad за деталями
Все инструкции по запуску находятся в README, вопросы в чатик
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16
Fragment Software
ME Airdrop Checker Чекер дропа Magic Eden, поддерживает многопоточность, сидки/приватники, отображает аллокацию, blazing fast 🍔 . Код грязный потому что рефакторить лень Короче вообще очень крутой 👍 Возможно мы будем делать антидрейн на дроп (только SOL)…
Update
Добавлен модуль для подвязки клейм кошелька к вашим eligible кошелькам
Если вы проверяли дроп прошлой версией этого чекера, то !обязательно! используйте новый модуль для привязки клейм кошелька, поскольку в прошлой версии для этого использовался случайный приватный ключ. На это у вас есть время до 9 декабря 16:00 МСК.
Канал / Чат / Fragment Monitors / Discord
Добавлен модуль для подвязки клейм кошелька к вашим eligible кошелькам
Если вы проверяли дроп прошлой версией этого чекера, то !обязательно! используйте новый модуль для привязки клейм кошелька, поскольку в прошлой версии для этого использовался случайный приватный ключ. На это у вас есть время до 9 декабря 16:00 МСК.
Канал / Чат / Fragment Monitors / Discord
🔥9
Magic Eden Claimer
Подготовили для вас клеймер токенов, который имеет дополнительные модули.
• Клеймер $ME с возможностью отправки аллокации на биржу все в одном бандле. За это мы берем 5% с аллокации.
• Перевод $ME + Закрытие $ME associated token account + отправка $SOL на кошелек из файла. За это мы берем 5% (~0.0001 SOL)
• $SOL multisender - отправка соланы с одного кошелька на несколько, мы забираем 3% от суммы.
И чтоб меньше 3$ не сливали🍺
Канал / Чат / Fragment Monitors / Discord
Подготовили для вас клеймер токенов, который имеет дополнительные модули.
• Клеймер $ME с возможностью отправки аллокации на биржу все в одном бандле. За это мы берем 5% с аллокации.
• Перевод $ME + Закрытие $ME associated token account + отправка $SOL на кошелек из файла. За это мы берем 5% (~0.0001 SOL)
• $SOL multisender - отправка соланы с одного кошелька на несколько, мы забираем 3% от суммы.
И чтоб меньше 3$ не сливали
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍4💅1
Жоско залетаем в Fuel Sale
Условия:
• У вас должен быть вл + KYC
• 100% профита идет мне
• Какие-то еще условия
• Софт стоит 10000$
• Исходник на ассмеблере, мы будем быстрее всех
По всем вопросам писать на почту kakjedohuyanasipet@gmail.com
ЛФГ + to the moon + wagmi + не убиваем темку☕️
Условия:
• У вас должен быть вл + KYC
• 100% профита идет мне
• Какие-то еще условия
• Софт стоит 10000$
• Исходник на ассмеблере, мы будем быстрее всех
По всем вопросам писать на почту kakjedohuyanasipet@gmail.com
ЛФГ + to the moon + wagmi + не убиваем темку
Please open Telegram to view this post
VIEW IN TELEGRAM
💅27👍9🗿6🔥3
Eclipse Farmer 🌈
Новогодний подарок🎁 для вас, софтик небольшой, поддерживает следующие протоколы:
• Lifinity (случайные свапы)
• Underdog (создание NFT со случайными параметрами)
• Официальный мост (EVM -> ECLIPSE)
Софт работает с базой данных sqlite, постарались сделать красиво и удобно, весь прогресс сохраняется там. Все маршруты строятся рандомно, помимо этого есть возможность установить кол-во потоков в конфиге, если у вас много аккаунтов.
Все вопросы пишите в чат, а мы уже активно работаем на расширенной версией этого же софта, где будет большинство протоколов этой сети👍
Канал / Чат / Fragment Monitors / Discord
Новогодний подарок
• Lifinity (случайные свапы)
• Underdog (создание NFT со случайными параметрами)
• Официальный мост (EVM -> ECLIPSE)
Софт работает с базой данных sqlite, постарались сделать красиво и удобно, весь прогресс сохраняется там. Все маршруты строятся рандомно, помимо этого есть возможность установить кол-во потоков в конфиге, если у вас много аккаунтов.
Все вопросы пишите в чат, а мы уже активно работаем на расширенной версией этого же софта, где будет большинство протоколов этой сети
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥36💅5👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍31🔥20🗿1
Eclipse Farmer Plus ➕
Расширенная версия Eclipse Farmer. Постарались добавить как можно больше протоколов, в данный момент доступны:
Eclipse:
• All domains (twitter connect + минт доменного имени)
• Gas station
• Invariant (свапы)
• Lifinity (свапы)
• Orca (свапы)
• Solar (свапы)
• Scope NFT (минт случайных NFT)
• Save finance (deposit/withdraw)
• Underdog (создание NFT)
EVM:
• Eclipse bridge
• Gas.zip
• Relay
Открытый код на Rust, все данные хранятся в БД SQLite, поддерживает многопоточность, все маршруты случайны, суммы и задержки имеют гибкие настройки. Имеется модуль для сбора всех монет в ETH. Функционал будет расширяться.
Поддержка: В случае возникновения вопросов или необходимости помощи, пользователи могут рассчитывать на поддержку от нашей команды.
Цена - 300$. По всем вопросам писать @igorfordly
Канал / Чат / Fragment Monitors / Discord
Расширенная версия Eclipse Farmer. Постарались добавить как можно больше протоколов, в данный момент доступны:
Eclipse:
• All domains (twitter connect + минт доменного имени)
• Gas station
• Invariant (свапы)
• Lifinity (свапы)
• Orca (свапы)
• Solar (свапы)
• Scope NFT (минт случайных NFT)
• Save finance (deposit/withdraw)
• Underdog (создание NFT)
EVM:
• Eclipse bridge
• Gas.zip
• Relay
Открытый код на Rust, все данные хранятся в БД SQLite, поддерживает многопоточность, все маршруты случайны, суммы и задержки имеют гибкие настройки. Имеется модуль для сбора всех монет в ETH. Функционал будет расширяться.
Поддержка: В случае возникновения вопросов или необходимости помощи, пользователи могут рассчитывать на поддержку от нашей команды.
Цена - 300$. По всем вопросам писать @igorfordly
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥8🗿1
Eclipse Turbotap 🫴
Софт для тапалки eclipse, основные моменты:
• Поддержка любых прокси
• Многопоточность
• Логика софта абсолютно идентична той, что на фронтенде сайта, переписывалось один в один во избежание бритвы
• Два режима регистрации аккаунтов:
1. Ручной вход в дискорд
2. Регистрация без дискорда (токены не нужны, этот шаг пропускается)
• Хранение нужной информации в бд
• Быстрый on-chain чекер баланса игрового кошелька, оставшихся тапов, общего количества тапов, количества тапов в секунду
• Off-chain чекер привязанных твиттер/дс аккаунтов, пассивного дохода, позиции в лидерборде
Открытый код на Rust.
Цена - 200$, для покупателей eclipse farmer plus скидка 10%. По всем вопросам писать @igorfordly
Канал / Чат / Fragment Monitors / Discord
Софт для тапалки eclipse, основные моменты:
• Поддержка любых прокси
• Многопоточность
• Логика софта абсолютно идентична той, что на фронтенде сайта, переписывалось один в один во избежание бритвы
• Два режима регистрации аккаунтов:
1. Ручной вход в дискорд
2. Регистрация без дискорда (токены не нужны, этот шаг пропускается)
• Хранение нужной информации в бд
• Быстрый on-chain чекер баланса игрового кошелька, оставшихся тапов, общего количества тапов, количества тапов в секунду
• Off-chain чекер привязанных твиттер/дс аккаунтов, пассивного дохода, позиции в лидерборде
Открытый код на Rust.
Цена - 200$, для покупателей eclipse farmer plus скидка 10%. По всем вопросам писать @igorfordly
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🗿5🔥4💅4
Fragment Software
Eclipse Turbotap 🫴 Софт для тапалки eclipse, основные моменты: • Поддержка любых прокси • Многопоточность • Логика софта абсолютно идентична той, что на фронтенде сайта, переписывалось один в один во избежание бритвы • Два режима регистрации аккаунтов: …
Хотелось бы освежить информацию с момента выхода софта ℹ️
– Добавлен режим регистрации на свои инвайт-коды, где сначала регистрируются те аккаунты из пачки, для которых уже есть инвайт-коды, и после успешной регистрации каждый из них экспортирует 3 новых кода. Затем для аккаунтов без кода регистрация выполняется в отдельных потоках с заданной задержкой, а каждый новый аккаунт также генерирует по 3 кода.
– Добавлен циклический режим тапов: в рандомный промежуток [X; Y] тапов аккаунт заснет на рандомный промежуток [M; N] секунд.
– Добавлен лимит тапов за запуск для аккаунта: спустя [X; Y] кликов, аккаунт отключится и не будет использован до следующего запуска
В связи с изменениями, цена повышается до 200$, скидка 10% для владельцев Eclipse Farmer Plus все ещё действует.
Канал / Чат / Fragment Monitors / Discord
– Добавлен режим регистрации на свои инвайт-коды, где сначала регистрируются те аккаунты из пачки, для которых уже есть инвайт-коды, и после успешной регистрации каждый из них экспортирует 3 новых кода. Затем для аккаунтов без кода регистрация выполняется в отдельных потоках с заданной задержкой, а каждый новый аккаунт также генерирует по 3 кода.
– Добавлен циклический режим тапов: в рандомный промежуток [X; Y] тапов аккаунт заснет на рандомный промежуток [M; N] секунд.
– Добавлен лимит тапов за запуск для аккаунта: спустя [X; Y] кликов, аккаунт отключится и не будет использован до следующего запуска
В связи с изменениями, цена повышается до 200$, скидка 10% для владельцев Eclipse Farmer Plus все ещё действует.
Канал / Чат / Fragment Monitors / Discord
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2💅1
Тещу golang (
- Многопоточный режим
- Прокси
- Слип, если кошелек недавно клеймил токены
Может быть добавлю еще и gas.zip кран, если понадобится. Тут для потребителей пост закончился
А теперь небольшое отступление про язык: Go нравится своей простотой и удобством, но система типов, на мой взгляд, через чур слабая — как будто пишешь на Python, а не на строго типизированном языке (Rust
P.S. Или может это я заржавел
Канал / Чат / Github
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13
История одного антидрейна [part 1]
В один из дней мне написал человек, которому нужна была услуга антидрейна. Ситуация была следующая:
Человек застейкал SOL, однако доступ к приватному кошельку был не только у него, но и у другого человека, который с помощью скрипта выводил застейканую SOL на свой кошелек.
Изучив прошлые транзакции, в которых скамер выводил деньги, я понял, что нужно было просто вызвать инструкцию withdraw в момент разлока. Из интересного: SOL можно было вывести на любой адрес, указав нужный to_pubkey. Обсудив условия, я решил взяться за эту задачу. На подготовку было около пяти дней, поэтому я начал искать способ гарантированно обойти соперника.
Смена owner'а у аккаунта
Многие знают, что в Solana можно сменить owner (владельца) кошелька. Я никогда не углублялся в детали, но слышал, что таким образом даже при наличии приватного ключа кошелек превращается в "кирпич". Поэтому я начал изучать, как это можно сделать.
После некоторого времени я нашел способ сменить owner аккаунта на другую программу. Программы в Solana не имеют приватных ключей — они контролируются upgrade authority (обычно это аккаунт, который деплоил программу).
План был прост:
1. Задеплоить программу с единственной функцией — передачей owner любой другой программе.
2. Перевести owner всех скомпрометированных кошельков на свою программу.
3. Когда нужно — вызвать инструкцию смены owner на System Program, выполнить нужные операции (например, клейм SOL со стейк-аккаунтов), а затем вернуть owner обратно на свою программу.
Получался своеобразный "сэндвич", и я был уверен, что это гарантирует успех.
Проверка гипотезы
Написав реализацию такой программы, я убедился, что это работает с переводом SOL: после смены owner действительно ничего нельзя было сделать. Но затем я решил проверить это с SPL-токенами — и у меня получилось. Почему?
Как устроен аккаунт в Solana
Чтобы понять причину, нужно разобраться в структуре аккаунта в Solana. У каждого аккаунта есть следующие поля: data, executable, lamports, owner, rent_epoch
Если внимательно изучить документацию, становится ясно, что owner может изменять только поле data или уменьшать значение lamports (баланс SOL).
То есть, если в транзакции указать fee payer (тот, кто оплачивает комиссию) — другой кошелек, то стейк без проблем уходит к мошеннику, несмотря на смену owner.
В один из дней мне написал человек, которому нужна была услуга антидрейна. Ситуация была следующая:
Человек застейкал SOL, однако доступ к приватному кошельку был не только у него, но и у другого человека, который с помощью скрипта выводил застейканую SOL на свой кошелек.
Изучив прошлые транзакции, в которых скамер выводил деньги, я понял, что нужно было просто вызвать инструкцию withdraw в момент разлока. Из интересного: SOL можно было вывести на любой адрес, указав нужный to_pubkey. Обсудив условия, я решил взяться за эту задачу. На подготовку было около пяти дней, поэтому я начал искать способ гарантированно обойти соперника.
Смена owner'а у аккаунта
Многие знают, что в Solana можно сменить owner (владельца) кошелька. Я никогда не углублялся в детали, но слышал, что таким образом даже при наличии приватного ключа кошелек превращается в "кирпич". Поэтому я начал изучать, как это можно сделать.
После некоторого времени я нашел способ сменить owner аккаунта на другую программу. Программы в Solana не имеют приватных ключей — они контролируются upgrade authority (обычно это аккаунт, который деплоил программу).
План был прост:
1. Задеплоить программу с единственной функцией — передачей owner любой другой программе.
2. Перевести owner всех скомпрометированных кошельков на свою программу.
3. Когда нужно — вызвать инструкцию смены owner на System Program, выполнить нужные операции (например, клейм SOL со стейк-аккаунтов), а затем вернуть owner обратно на свою программу.
Получался своеобразный "сэндвич", и я был уверен, что это гарантирует успех.
Проверка гипотезы
Написав реализацию такой программы, я убедился, что это работает с переводом SOL: после смены owner действительно ничего нельзя было сделать. Но затем я решил проверить это с SPL-токенами — и у меня получилось. Почему?
Как устроен аккаунт в Solana
Чтобы понять причину, нужно разобраться в структуре аккаунта в Solana. У каждого аккаунта есть следующие поля: data, executable, lamports, owner, rent_epoch
Если внимательно изучить документацию, становится ясно, что owner может изменять только поле data или уменьшать значение lamports (баланс SOL).
То есть, если в транзакции указать fee payer (тот, кто оплачивает комиссию) — другой кошелек, то стейк без проблем уходит к мошеннику, несмотря на смену owner.
1🔥13👍1
История одного антидрейна [part 2]
Смена authority у стейк-аккаунта
Отбросив вариант со сменой owner у кошельков, я начал искать альтернативу. Для этого я углубился в изучение исходного кода Stake Program и обнаружил интересную функцию authorize, которая принимает следующие параметры:
Когда вы стейкаете SOL, создается отдельный стейк-аккаунт — специальный аккаунт для безопасного хранения и делегирования средств. У него есть два важных поля:
• staker — отвечает за деактивацию стейкинга (да, перед выводом средств стейк нужно сначала деактивировать).
• withdrawer — отвечает за вывод средств из стейк-аккаунта.
По умолчанию оба этих поля указывают на кошелек, с которого был активирован стейкинг.
Тестирование идеи
Я создал тестовый кошелек, застейкал SOL и написал скрипт, который менял withdrawer. Воодушевленный, я попробовал сделать то же самое на реальных аккаунтах, но столкнулся с проблемой:
Эти аккаунты отличались от тестового — на них стоял lockup (временная блокировка).
Для смены withdrawer до истечения lockup требовалась дополнительная подпись от custodian (хранителя блокировки), которой ни у кого не было.
Альтернативный план: смена staker
Тогда я решил пойти другим путем — сменить staker, чтобы злоумышленник не мог деактивировать стейкинг. Без деактивации он не смог бы вывести средства даже после lockup'а.
Я успешно изменил staker на всех аккаунтах, но, изучая код Stake Program, наткнулся на важный нюанс:
Вывод:
Для смены staker нужна подпись либо текущего staker, ЛИБО withdrawer.
Это означало, что злоумышленник, имея доступ к withdrawer, всё равно мог изменить staker и обойти мою "защиту".
Оставалось только надеяться, что он не разберётся в этом/не успеет подготовиться.
Смена authority у стейк-аккаунта
Отбросив вариант со сменой owner у кошельков, я начал искать альтернативу. Для этого я углубился в изучение исходного кода Stake Program и обнаружил интересную функцию authorize, которая принимает следующие параметры:
/// Authorize a key to manage stake or withdrawal
///
/// # Account references
/// 0. `[WRITE]` Stake account to be updated
/// 1. `[]` Clock sysvar
/// 2. `[SIGNER]` The stake or withdraw authority
/// 3. Optional: `[SIGNER]` Lockup authority, if updating StakeAuthorize::Withdrawer before
/// lockup expiration
Authorize(Pubkey, StakeAuthorize)
Когда вы стейкаете SOL, создается отдельный стейк-аккаунт — специальный аккаунт для безопасного хранения и делегирования средств. У него есть два важных поля:
• staker — отвечает за деактивацию стейкинга (да, перед выводом средств стейк нужно сначала деактивировать).
• withdrawer — отвечает за вывод средств из стейк-аккаунта.
По умолчанию оба этих поля указывают на кошелек, с которого был активирован стейкинг.
Тестирование идеи
Я создал тестовый кошелек, застейкал SOL и написал скрипт, который менял withdrawer. Воодушевленный, я попробовал сделать то же самое на реальных аккаунтах, но столкнулся с проблемой:
Эти аккаунты отличались от тестового — на них стоял lockup (временная блокировка).
Для смены withdrawer до истечения lockup требовалась дополнительная подпись от custodian (хранителя блокировки), которой ни у кого не было.
Альтернативный план: смена staker
Тогда я решил пойти другим путем — сменить staker, чтобы злоумышленник не мог деактивировать стейкинг. Без деактивации он не смог бы вывести средства даже после lockup'а.
Я успешно изменил staker на всех аккаунтах, но, изучая код Stake Program, наткнулся на важный нюанс:
pub fn authorize(
&mut self,
signers: &HashSet<Pubkey>,
new_authorized: &Pubkey,
stake_authorize: StakeAuthorize,
lockup_custodian_args: Option<(&Lockup, &Clock, Option<&Pubkey>)>,
) -> Result<(), InstructionError> {
match stake_authorize {
StakeAuthorize::Staker => {
// Allow either the staker or the withdrawer to change the staker key
if !signers.contains(&self.staker) && !signers.contains(&self.withdrawer) {
return Err(InstructionError::MissingRequiredSignature);
}
...
Вывод:
Для смены staker нужна подпись либо текущего staker, ЛИБО withdrawer.
Это означало, что злоумышленник, имея доступ к withdrawer, всё равно мог изменить staker и обойти мою "защиту".
Оставалось только надеяться, что он не разберётся в этом/не успеет подготовиться.
🔥13👍1
История одного антидрейна [part 3]
Подготовка к решающему моменту
Я предположил, что скамер не сразу разберётся в ситуации, и у меня будет шанс сменить withdrawer сразу после окончания lockup. Для этого я начал писать скрипт на Rust, который должен был:
Спамить транзакции в многопотоке и использовать skip_preflight = true (это означает, что транзакции будут отправляться без предварительной проверки, что увеличивает скорость)
Ключевые требования к скрипту:
1. Надёжный landing транзакций
• Арендовал ноду со staked-connection (выбрал Urban, так как с Deeznode был негативный опыт).
2. Уникальные сигнатуры транзакций
• Если отправлять одинаковые транзакции, нода будет их фильтровать как дубликаты.
• Решение: добавлял небольшой рандомный unit_price
Rust помог избежать глупых ошибок, но логику пришлось перепроверять несколько раз.
Момент истины
Lockup заканчивался в 00:00 UTC. Я настроил скрипт так, чтобы спам транзакций начинался за 2 секунды до разлока.
Обратный отсчёт: 3... 2... 1...
Проверяю результат — и вижу, что staker и withdrawer остались прежними. При этом, судя по истории транзакций, никто, кроме меня, не пытался ничего изменить. "Скамер сдался?" — подумал я.
Но через 7 минут появились новые транзакции — мой оппонент всё же действовал. Он сменил staker и withdrawer на другие адреса. Это означало моё поражение.
Разбор
На следующий день, несмотря на тильт, я решил разобраться, что пошло не так. Сравнивая свои транзакции с его, я не находил различий — они были идентичны, кроме адресов назначения.
Оказалось:
Последняя моя транзакция была отправлена в 23:59:59.
В 00:00 на кошельке, который оплачивал комиссии, закончился газ.
В решающий момент ни одна транзакция не ушла.
За ~2 секунды я:
• Сжёг ~1 SOL
• Залендил >700 транзакций
Вывод
Cкрипт был слишком эффективен и опустошил баланс раньше времени, я переиграл сам себя. Этот опыт стал для меня ценным уроком, надеюсь, эта история будет полезной (или хотя бы интересной). Всем gl!
Подготовка к решающему моменту
Я предположил, что скамер не сразу разберётся в ситуации, и у меня будет шанс сменить withdrawer сразу после окончания lockup. Для этого я начал писать скрипт на Rust, который должен был:
Спамить транзакции в многопотоке и использовать skip_preflight = true (это означает, что транзакции будут отправляться без предварительной проверки, что увеличивает скорость)
Ключевые требования к скрипту:
1. Надёжный landing транзакций
• Арендовал ноду со staked-connection (выбрал Urban, так как с Deeznode был негативный опыт).
2. Уникальные сигнатуры транзакций
• Если отправлять одинаковые транзакции, нода будет их фильтровать как дубликаты.
• Решение: добавлял небольшой рандомный unit_price
let unit_price = rand::thread_rng().gen_range(3_500_000u64..=4_500_000u64);
Rust помог избежать глупых ошибок, но логику пришлось перепроверять несколько раз.
Момент истины
Lockup заканчивался в 00:00 UTC. Я настроил скрипт так, чтобы спам транзакций начинался за 2 секунды до разлока.
Обратный отсчёт: 3... 2... 1...
Проверяю результат — и вижу, что staker и withdrawer остались прежними. При этом, судя по истории транзакций, никто, кроме меня, не пытался ничего изменить. "Скамер сдался?" — подумал я.
Но через 7 минут появились новые транзакции — мой оппонент всё же действовал. Он сменил staker и withdrawer на другие адреса. Это означало моё поражение.
Разбор
На следующий день, несмотря на тильт, я решил разобраться, что пошло не так. Сравнивая свои транзакции с его, я не находил различий — они были идентичны, кроме адресов назначения.
Оказалось:
Последняя моя транзакция была отправлена в 23:59:59.
В 00:00 на кошельке, который оплачивал комиссии, закончился газ.
В решающий момент ни одна транзакция не ушла.
За ~2 секунды я:
• Сжёг ~1 SOL
• Залендил >700 транзакций
Вывод
Cкрипт был слишком эффективен и опустошил баланс раньше времени, я переиграл сам себя. Этот опыт стал для меня ценным уроком, надеюсь, эта история будет полезной (или хотя бы интересной). Всем gl!
50🔥36👍2