Нажмите ESC, чтобы закрыть

Стат-арбитраж на мем-коинах: Скрипт для слежки за китами.

Здорово, кодеры и искатели легкого профита. Сразу проясним: если вы думаете, что мем-коины - это про веселое комьюнити и картинки с собаками в шляпах, то закрывайте вкладку. Мем-коины - это чистая PvP арена, где профессиональные хищники раздевают хомяков в промышленных масштабах. И лучший способ не стать ликвидностью для чужого фикса - это сесть на хвост тем, кто этот рынок двигает. То есть Smart Money.

Сегодня разберем, как крутить статистический арбитраж на этом безумии с помощью Python, как выуживать правильные кошельки из блокчейна и копировать их транзакции до того, как токен улетит на Луну, оставив толпе лишь выжженную землю.

Анатомия Smart Money на мемах: Кто они такие?

В дексах (DEX) «умные деньги» делятся на три категории. Без понимания этого твой скрипт просто сольет депозит на комиссиях. Хотя нет, постой, на Solana или Base комиссии копеечные... Но на проскальзывании (slippage) тебя все равно размотает.

  • Инсайдеры (Девелоперы и их кенты): Снайпят токен в первую секунду после деплоя. Они знают код контракта. Знают, когда будет маркетинг. Часто у них кошельки связаны через миксеры, но мы их ловим по паттерну «первая транзакция на покупку 5% саплая».
  • Снайперы с кастомным софтом: Челы, которые сидят на быстрых RPC-нодах и выкупают каждый перспективный пул.
  • Трендовые киты: Анализируют социальный сентимент и вливают по 10–20 ETH / 500 SOL в токен на ранней стадии, создавая зеленые свечи в стакане. Вот за ними идти безопаснее всего.
Тип кошелькаСкорость входаРиск реверта (скама)Стратегия авто-выхода
ИнсайдерМоментально (блок 0-1)Экстремальный (Rug pull)Фикс 50% после 2х, остальное в безубыток
Кит-трейдерВ течение 5-15 минутСреднийТейк по тренду, выход при замедлении объемов
MEV-ботМилисекундыНизкий (они сами фронтранят)Не копировать! (Скрипт тупо отдаст деньги на газ)

Смертельная ошибка №1: Пытаться копировать MEV-ботов, которые крутят сэндвич-атаки в мемпуле Ethereum. Ты никогда не обгонишь их Flashbots-бандлы. Твой скрипт просто отправит транзакцию, поймает реверт, и ты потеряешь бабки на газе. Я сам неделю назад словил такой реверт на Base, когда забыл отфильтровать контракты-маршрутизаторы. Минус 50 баксов чисто на воздух.

Как выследить «Жирного Кита»: Логика парсинга

План простой. Нам нужно парсить логи децентрализованных бирж (например, Uniswap v3 на Base или Raydium на Solana) за последние пару дней. И искать кошельки, которые сделали на мем-коинах минимум 5–10х.

Для этого не нужны платные API за тысячи баксов. Достаточно бесплатного тарифа на QuickNode или Alchemy и базового понимания, как устроены logs в блокчейне. Каждая покупка на DEX триггерит событие Swap. Мы вытягиваем эти адреса, закидываем в базу (MariaDB вполне ок, не надо городить Postgres для простых логов), и смотрим на их PnL.

Тут я сначала хотел написать парсер через inline-ассемблер на Rust, ну чтобы вообще летело... Но потом забил. Слишком много мороки ради MVP. Python с библиотекой web3.py сожрет это и не поморщится.

Пишем рабочий скрипт: Трекер и авто-байер

Ниже готовый скрипт для EVM-сетей (Base, Arbitrum, BSC). Он слушает RPC-ноду, фильтрует транзакции конкретного кошелька (нашего целевого кита) и, как только тот вызывает функцию swapExactTokensForTokens или аналогичную, мгновенно отправляет аналогичный бай-ордер.

В L2 мемпула нет. Вообще. Всё работает по FCFS (First Come, First Served). Кто первый встал — того и тапки. Поэтому скорость твоей ноды решает всё.

Python

import time
import os
from web3 import Web3
from eth_account import Account
# Конфиг. Заполняй своими данными, бро.
RPC_URL = "https://mainnet.base.org"  # Возьми приватную ноду, публичная сдохнет через минуту
PRIVATE_KEY = "ТВОЙ_ПРИВАТНИК_СЮДА_НЕ_ПАЛИ_ЕГО"
SMART_MONEY_ADDRESS = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e" # Адрес кита, за которым следим
ROUTER_ADDRESS = "0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24" # Пример роутера Uniswap v3 на Base
# WETH и токен, который покупаем (целевой адрес вытащим из транзы кита)
WETH_ADDRESS = "0x4200000000000000000000000000000000000006"
w3 = Web3(Web3.HTTPProvider(RPC_URL))
account = Account.from_key(PRIVATE_KEY)
# Минимальный ABI для роутера, только чтоб свапнуть
ROUTER_ABI = [
    {
        "inputs": [
            {"internalType": "uint256", "name": "amountOutMin", "type": "uint256"},
            {"internalType": "address[]", "name": "path", "type": "address[]"},
            {"internalType": "address", "name": "to", "type": "address"},
            {"internalType": "uint256", "name": "deadline", "type": "uint256"}
        ],
        "name": "swapExactETHForTokens",
        "outputs": [{"internalType": "uint256[]", "name": "amounts", "type": "uint256[]"}],
        "stateMutability": "payable",
        "type": "function"
    }
]
router_contract = w3.eth.contract(address=ROUTER_ADDRESS, abi=ROUTER_ABI)
def buy_token(target_token_address, eth_amount_to_spend):
    """Тупо покупаем токен по маркету вслед за китом"""
    nonce = w3.eth.get_transaction_count(account.address)
    
    # Строим транзу. Газ ставим с запасом, иначе пролив, стакан двинется и мы в реверте
    tx = router_contract.functions.swapExactETHForTokens(
        0, # amountOutMin = 0. Да, проскальзывание 100%, на мемах по-другому никак, иначе не нальют
        [WETH_ADDRESS, target_token_address],
        account.address,
        int(time.time()) + 60
    ).build_transaction({
        'from': account.address,
        'value': w3.to_wei(eth_amount_to_spend, 'ether'),
        'gas': 250000,
        'maxFeePerGas': w3.eth.gas_price * 2, # Перебиваем средний газ, чтоб зайти первыми
        'maxPriorityFeePerGas': w3.to_wei(2, 'gwei'),
        'nonce': nonce,
        'chainId': 8453 # Base chain id
    })
    
    signed_tx = w3.eth.account.sign_transaction(tx, private_key=PRIVATE_KEY)
    tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
    print(hex(tx_hash)) # ПРОФИТ НА БАЗУ? Посмотрим в эксплорере...
def monitor_wallet():
    print("Скрипт погнал. Ищем куда кит заносит котлету...")
    last_block = w3.eth.block_number
    
    while True:
        try:
            current_block = w3.eth.block_number
            if current_block > last_block:
                for block_num in range(last_block + 1, current_block + 1):
                    block = w3.eth.get_block(block_num, full_transactions=True)
                    for tx in block.transactions:
                        # Проверяем, не кит ли отправил транзу
                        if tx['from'].lower() == SMART_MONEY_ADDRESS.lower():
                            print("Б*ЯТЬ! Кит зашевелился!")
                            
                            # Нам нужно понять, что он дернул роутер. 
                            # Для простоты: если транза идет на контракт роутера - это наш клиент
                            if tx['to'] and tx['to'].lower() == ROUTER_ADDRESS.lower():
                                # Тут в реале надо парсить input data, доставать адрес токена.
                                # Допустим, мы вытащили адрес из логов или input. 
                                # Для примера подставим гипотетический щиткоин:
                                target_meme = "0x1111111111111111111111111111111111111111" 
                                
                                print(f"Повторяем за китом. Покупаем {target_meme}")
                                buy_token(target_meme, 0.01) # Заходим на копейки для теста
                                
                last_block = current_block
            time.sleep(0.5) # Чтобы нода не забанила за спам-реквесты
        except Exception as e:
            # Спит кодер, но не спит ошибка в 3 часа ночи
            print(f"Что-то легло, рестартуем цикл: {e}")
            time.sleep(1)
if __name__ == "__main__":
    monitor_wallet()

Риски, подводные камни и как из вас сделают ликвидность

Пока твой скрипт тупит и проверяет баланс, кит может банально разводить своих фолловеров. Или мне это кажется? Пишите в комменты, если я не прав... Но есть такая тема, как Honeypot (Медовый горшок).

Схема старая как мир:

  1. Кит (или инсайдер) деплоит токен, в коде которого прописан запрет на продажу для всех, кроме доверенных адресов.
  2. Кит сам у себя покупает этот токен на глазах у всего блокчейна.
  3. Твой скрипт видит транзакцию «умных денег», летит в этот же блок, покупает...

Поздравляю. Ты купил фантик, который физически невозможно продать обратно в пул. Твои деньги заперты навсегда. Кит забирает ликвидность, ты сосешь лапу.

Как защититься? Перед покупкой скрипт должен делать симуляцию транзакции (например, через eth_call). Если симуляция продажи (sell) выдает ошибку или revert, токен сразу в блеклист. Если не внедрить эту проверку прямо в логику, сольешь депо за пару дней.

========================================================================

Раз уж заикнулся про симуляции, давай разберем эту боль подробнее. Большинство новичков думает: «Я сейчас напишу парсер логов, буду залетать по маркету и грести профит лопатой». Фиг там.
Без пре-трейд симуляции ты — просто бесплатный обед для скамеров.

Пре-трейд симуляция: Как не купить Honeypot

Когда кит залетает в новый контракт, твой скрипт не должен слепо копировать адрес. Нужно проверить, можно ли этот щиткоин вообще продать обратно. Для этого используется метод eth_call. Мы имитируем вызов функции swapExactTokensForETH локально на ноде, не отправляя транзакцию в реальную сеть.
Если нода возвращает реверт (ошибку) — токен идет в блеклист, скрипт курит бамбук, твои деньги целы.
Вот тебе кусок кода, который нужно внедрить прямо перед функцией buy_token. Тут я не стал городить полноценный симулятор с форком сети (хотя через Hardhat/Anvil это делать правильнее всего, но мы же пишем быстрый скрипт на коленке).

Python

def check_honeypot(token_address):
    """
    Проверяем токен на вшивость. Имитируем покупку и продажу.
    Если контракт не дает продать — это скам.
    """
    # Юзаем роутер для проверки. Подсовываем копеечный объем.
    test_amount_in = w3.to_wei(0.001, 'ether')
    
    try:
        # Симулируем покупку через eth_call
        # Мы просто смотрим, не вылетит ли ошибка на уровне контракта
        router_contract.functions.swapExactETHForTokens(
            0,
            [WETH_ADDRESS, token_address],
            account.address,
            int(time.time()) + 60
        ).call({'from': account.address, 'value': test_amount_in})
        
        # По-хорошему, тут надо симулировать еще и СЕЙЛ (продажу).
        # Но для этого на балансе уже должны быть эти токены, либо надо делать форк сети.
        # В 3 часа ночи сойдет и проверка на простую симуляцию бай-функции, 
        # так как многие жесткие ханипоты ломаются уже на этапе обращения к роутеру.
        return True
    except Exception as e:
        print(f"ВНИМАНИЕ! Токен {token_address} завалил симуляцию: {e}. Пропускаем этот мусор.")
        return False

Стратегия выхода: Фиксация профита на базу

Купить — это полделения. Вовремя выйти на мемы-рынке — вот настоящее искусство. Мем-коины живут по законам параболы. Быстрый взлет, плато, и моментальный пролив в ноль, когда ранние киты начинают фиксироваться об стакан.
Я для себя выработал полуавтоматическую лесенку фиксации. Работает железно:

  • Планка 2х (+100%): Скрипт автоматически продает ровно 50% позиции. Всё, ты забрал тело депозита, ты в бесплатной сделке. Дальше психологически торговать легче в сто раз.
  • Планка 3х (+200%): Сливаем еще 25% от остатка.
  • Трейлинг-стоп: Остаток позиции (лун-бэг) тянется по тренду. Как только цена падает на 20% от локального пика — скрипт закрывает всё по маркету.

Лайфхак из окопов: Никогда не ставь amountOutMin в ноль при продаже, если позиция жирная. Если ты решишь ливануть токен на $500 в пул с ликвидностью $2000, тебя сожрут MEV-боты через фронтраннинг. Твой скрипт получит копейки из-за дикого проскальзывания. Продавать надо частями, небольшими ордерами.

Где искать адреса Smart Money для старта?

Скрипт без правильных адресов — просто набор букв. Где брать кошельки китов?

  • Dextools / Dexscreener: Открываешь топ-взлетов за последние 24 часа. Переходишь во вкладку Top Traders или Transactions. Ищешь челов, которые зашли на старте (блок 0-100) и вышли на хаях. Копируешь их адреса.
  • DeBank / Arkham: Закидываешь туда скопированный адрес. Смотришь винрейт трейдера. Если у него на балансе лежит $100k+, поднятых чисто с депозита в $500 на щиткоинах — это наш клиент. Добавляешь его в массив SMART_MONEY_ADDRESSES в своем скрипте.

Итог для прагматиков

Статистический арбитраж и копитрейдинг на мемах — это не кнопка «бабло». Это постоянная гонка скоростей и фильтрация скама. Пока твой скрипт работает на публичной RPC-ноде, ты всегда будешь в хвосте. Хочешь реальный профит — покупай приватный доступ к нодам (например, Jito для Solana или кастомные EVM-ноды с поддержкой быстрых транзакций), оптимизируй логику проверок и жестко контролируй риски.
И главное - не заноси в щитки то, что боишься потерять. Завтра проект сделает реверт, дев выдернет ликвидность, и никакой скрипт тебя не спасет.


FAQ

Вешаем подписку на логи JSON-RPC провайдера и фильтруем ивенты Transfer или Swap с контрактов фабрик и роутеров основных AMM. Для автоматического поиска вытягиваем логи из v3-core или v2-periphery через web3.eth.filter() или сырые RPC-вызовы eth_getLogs. Скриптом разбираем сигнатуры транзакций и закидываем данные в локальную MariaDB, чтобы на месте считать исторический ROI кошельков.

Шлём eth_call на адрес роутера DEX с кастомным подписанным payload (from, to, data, value). Это позволяет протестить транзу без отправки в сеть. Если внутри токена зашит ханипот, блокирующий обратный трансфер, EVM сразу выдаст ошибку execution revert. Скрипт мгновенно пометит щиткоин и занесёт его в блэклист, сохранив вам газ.

В L2 из-за архитектуры Секвенсора вообще нет публичного мемпула. Фронтран и оценка очереди транзакций там не работают физически. Секвенсор пакует блоки строго по принципу FCFS (первым пришел - первым обслужен). В итоге скорость копитрейдинга полностью зависит от задержки до приватной RPC-ноды и грамотного заброса приорити-фи прямо в билдер Секвенсора.
Sergey Zhukov

Senior Back-End Engineer and Technical Architect with 8 years of experience engineering high-performance distributed systems, low-latency trading infrastructure, and complex Web3 data pipelines.

Verification & Professional Profiles: Linkedin Profile

...

Поделитесь своим мнением

Ваш e-mail не будет опубликован. Обязательные поля отмечены *