crypto-folio

Понятно, практично, по делу

Вопросы и ответы·24 июня 2026 г.·7 мин

Безопасная проверка пула ликвидности перед стейкингом активов

DeFi-сегмент ежегодно теряет миллиарды долларов на эксплойтах и rug pull. Стейкинг в пул ликвидности без предварительной проверки контракта — это операция с отрицательным матожиданием.

Безопасная проверка пула ликвидности перед стейкингом активов

Задача пользователя: зафиксировать набор бинарных проверок, каждая из которых выдаёт однозначный ответ «да/нет», и не отступать от протокола вне зависимости от заявленной доходности.

1. Постановка задачи: что именно проверяем

Пул ликвидности (LP) — смарт-контракт, который хранит резервы двух или более токенов и выдаёт поставщику LP-токен, подтверждающий долю в пуле. Риски стейкинга делятся на четыре класса с разными механизмами.

Класс рискаМеханизм потериДиапазон потерь
Rug pullВладелец выводит ликвидность через removeLiquidity, setRouter или withdraw100% депозита
HoneypotКупить токен можно, продать нельзя (sell tax = 100% или blacklist)100% депозита
Эксплойт кодаУязвимость в контракте (reentrancy, oracle manipulation, flash loan attack)10–100% TVL
Имперманентная потеряРасхождение цен активов в паре5–50% депозита

По теме также можно посмотреть Путешествия, туризм, направления и путеводители.

По теме также можно посмотреть Информационно-аналитический хаб о блокчейн-технологиях, Web3 и криптографии.

По теме также можно посмотреть Факт-чек и разбор новостей: правда или миф, разбираем новости, как это проверить,.

Три первых класса — детерминированные. Их можно проверить до открытия позиции, без депозита. Четвёртый — рыночный, зависит от волатильности пары и хеджируется отдельно.

2. Предварительная фильтрация: TVL, возраст, аудит

Перед чтением кода отсеивается большинство проектов по трём метрикам, доступным через агрегаторы и обозреватели.

2.1. Total Value Locked

Источники: DeFiLlama, DefiPulse, обозреватель пары. Минимальный порог для пары на EVM-цепях — $500 тыс. на основной паре. Ниже этого уровня — недостаточная ликвидность для безопасного выхода и повышенный риск манипуляции ордербуком. Дополнительно проверяется удержание TVL в течение минимум 14 дней: резкий рост за сутки при отсутствии органического трафика — признак накачки TVL перед rug pull.

2.2. Возраст контракта

Дата деплоя берётся из обозревателя (Etherscan, BscScan, Arbiscan, Polygonscan). Возраст менее 30 дней — повышенный риск. Менее 7 дней — отказ. Характерный срок жизни honeypot-контрактов и rug pull-пулов — несколько недель: времени на привлечение средств и вывод обычно не хватает на длинный горизонт.

2.3. Аудит

Проверяется наличие отчёта от аудиторов с устоявшейся репутацией: Certik, Hacken, OpenZeppelin, PeckShield, SlowMist, Trail of Bits, Consensys Diligence, Quantstamp. Наличие PDF с findings не равно безопасности. Смотрятся три параметра:

  • Дата аудита: старше года — перепроверить текущий код. Разработчики могли деплоить новую версию после проверки.
  • Количество нерешённых критических issues: > 0 — отказ.
  • Репутация аудитора: проверяется через собственный портфель проектов аудитора. Аудитор с десятками проектов надёжнее ноунейма с первым контрактом.
Аудит подтверждает, что код делает то, что заявлено в спецификации. Аудит не подтверждает, что код безопасен для конкретного депозита.

3. Чтение контракта в обозревателе

После прохождения фильтра открывается исходник контракта пула. Цель — найти функции, контролирующие активы, и определить, кому они доступны.

3.1. Verified Source

В обозревателе ищется вкладка «Contract» → «Code». Статус «Verified» обязателен. Без verified source — отказ, дальнейшие шаги не выполняются. Верификация гарантирует совпадение байткода на блокчейне с опубликованным Solidity-кодом.

3.2. Список критических функций

В исходнике ищутся следующие сигнатуры и классифицируются по доступу.

  • setFee(uint256 _fee) — изменение комиссии. Допустимо при верхнем ограничении: require(_fee <= 3000) (30% в basis points). Без ограничения — rug pull через установку 100% sell fee.
  • withdraw(address _token, uint256 _amount) или emergencyWithdraw — вывод произвольного токена из контракта. Доступна владельцу — rug pull через одну транзакцию. Отказ.
  • pause() и unpause() — стоп-механизм. Допустимо только при вызове через timelock с задержкой > 24 часов. Без timelock — owner ставит паузу и выводит активы.
  • migrate(address newRouter) или setRouter(address _router) — смена роутера. Доступ owner без timelock — подмена роутера на собственный контракт с последующим опустошением. Допустимо только с timelock > 48 часов.
  • setMaxTxAmount и setMaxWallet — лимиты на размер транзакции и кошелька. Доступ owner без timelock — риск honeypot: после депозита крупных игроков owner устанавливает лимит = 1 wei, блокируя вывод.
  • setBlacklist и mapping(address => bool) isBlacklisted — чёрный список. Доступ owner без timelock — выборочная заморозка средств.

Каждая найденная функция заносится в таблицу решений:

ФункцияДоступОграничениеВердикт
setFeeownerrequire(_fee <= 3000)Допустимо
withdrawownerнетОтказ
pauseownertimelock 48чДопустимо
migrateownertimelock 48чДопустимо
setRouterownerнетОтказ
setBlacklistownerнетОтказ

3.3. Ownership

Проверяется функция owner(). Два допустимых варианта:

1. owner() == address(0)renounceOwnership выполнен. Предпочтительный сценарий: разработчик больше не может менять параметры.

2. owner() возвращает адрес мультисиг-кошелька Gnosis Safe с порогом подписи > 2/3 и публичными адресами подписантов.

Любой EOA (внешний кошелёк) в роли owner — отказ. Ключ может быть скомпрометирован, держатель — выведен из проекта.

4. Проверка ликвидности и лока

Даже при renounced ownership rug pull возможен через вывод ликвидности из пары, если LP-токены остались у разработчика. Проверяется блокировка.

4.1. LP-токен пары

В обозревателе находится адрес пары (для Uniswap V2-форка — через factory.getPair(tokenA, tokenB), для V3 — через NonfungiblePositionManager). Читаются getReserves() и totalSupply() LP-токенов. Доля LP-токенов у одного адреса должна быть < 50%. Концентрация > 80% у одного кошелька — rug pull через одну транзакцию вывода.

4.2. Lock-контракт

В истории пары ищется транзакция, в которой LP-токены переведены на адрес известного локера: Unicrypt Network, Team Finance, Mudra Locker, PinkLock. Лок верифицируется через API локера или через обозреватель: lock-контракт должен иметь метод getLock с параметрами unlockDate и amount. Блокировка менее 6 месяцев — повышенный риск. Менее 30 дней — отказ.

4.3. Burn LP

Альтернатива локу — отправка LP-токенов на 0x000000000000000000000000000000000000dead. Проверяется в истории пары: крупная транзакция Transfer на dead-адрес от разработчика означает сожжённую ликвидность. Ручной вывод невозможен.

5. Honeypot-симуляция

Симуляция продажи токена до депозита. Используются специализированные сервисы и ручная проверка исходника.

5.1. Sell tax

Проверяется через honeypot.is, tokensniffer.com, dextools.io. Допустимый диапазон:

  • Buy tax: 0–5%
  • Sell tax: 0–5%
  • Transfer tax: 0%

Sell tax > 10% — отказ. Sell tax = 100% — honeypot, отказ. Асимметрия buy/sell > 5% (например, buy 0%, sell 8%) — отказ.

5.2. Blacklist и whitelist

В исходнике проверяется mapping(address => bool) isBlacklisted и функция setBlacklist(address, bool). Доступ owner без timelock — отказ. Режим whitelist-only для продаж — отказ (схема pump-and-dump для ограниченного круга адресов).

5.3. Симуляция транзакции

Перед подписанием approve + deposit выполняется форк-симуляция в Tenderly. Подставляются реальные параметры (адрес кошелька, сумма) и проверяются:

  • deposit не revert'ится
  • Gas estimate < 500k
  • Возвращаемое значение соответствует ожидаемому количеству LP-токенов

Revert в симуляции — отказ вне зависимости от текста ошибки.

6. Протокол принятия решения

Собранные данные сводятся в финальную матрицу.

ПроверкаРезультатДействие при «нет»
1TVL > $500kда/нетОтказ
2Возраст контракта > 30 днейда/нетОтказ
3Аудит без unresolved criticalда/нетОтказ
4Verified sourceда/нетОтказ
5Owner renounced или multisigда/нетОтказ
6Нет owner-функций withdraw/setRouter без timelockда/нетОтказ
7LP lock > 6 мес. или burnда/нетОтказ
8Sell tax < 5%да/нетОтказ
9Симуляция deposit проходитда/нетОтказ

6.1. Размер позиции

При прохождении всех девяти проверок — максимум 2% портфеля на один LP. При одной-двух оговорках (например, timelock 24 часа вместо 48, или TVL $400k) — 0.5% портфеля. При трёх и более оговорках — 0. Депозит свыше 2% на один LP — отказ вне зависимости от результатов проверок: диверсификация обязательна.

6.2. Мониторинг после депозита

Стейкинг не заканчивается на deposit. Контракт может быть обновлён через proxy, owner может быть восстановлен, аудитор может обнаружить критическую уязвимость постфактум. Обязательные действия:

  • Подписка на GitHub-репозиторий проекта: уведомления о новых коммитах.
  • Мониторинг обозревателя: уведомления о крупных транзакциях с участием owner-адреса.
  • Проверка каждые 14 дней: TVL, holder distribution, статус lock, изменение owner.
Бинарный протокол: на каждом шаге — да или нет. Ответ «вероятно» равен ответу «нет».

Для отслеживания смежной повестки — от новостной ленты до практических гидов — работает агрегатор на burcusaral.com.

Итог

Безопасный стейкинг в пул ликвидности — это не доверие к бренду протокола и не оценка доходности, а последовательность из девяти бинарных проверок. TVL выше порога, возраст контракта больше месяца, аудит без нерешённых критических issues, верифицированный исходник, renounced owner или мультисиг, отсутствие критических owner-функций без timelock, LP залочен на полгода или сожжён, sell tax ниже 5%, симуляция deposit проходит. Каждый пункт — либо «да», либо «нет». Ответ «вероятно» приравнивается к «нет». Депозит сверх установленного лимита позиции — отказ вне зависимости от результатов проверки. Вердикт: безопасно — только при девяти «да» подряд и размере позиции ≤ 2% портфеля. Любая другая комбинация — небезопасно.

Частые вопросы

Какой минимальный TVL должен быть у пула ликвидности для безопасного стейкинга?
Для пар на EVM-цепях минимальный порог составляет $500 тыс. на основной паре.
Что делать, если у владельца контракта есть функция вывода средств?
Если функция вывода произвольного токена доступна владельцу, это является признаком rug pull, и от участия в таком пуле следует отказаться.
Как проверить, что ликвидность разработчика надежно заблокирована?
Необходимо убедиться, что LP-токены переведены на адрес известного локера с периодом блокировки не менее 6 месяцев или отправлены на «мертвый» адрес для сжигания.
Почему важно проверять наличие timelock для функций управления?
Timelock с задержкой более 24–48 часов предотвращает возможность мгновенного изменения параметров контракта владельцем, что защищает активы от внезапного вывода или блокировки.
Какой уровень комиссии на продажу токена считается допустимым?
Допустимый уровень sell tax составляет от 0% до 5%. При значении выше 10% от участия в пуле следует отказаться.
Текст: Анатолий Гуляев, Обозреватель смарт-контрактов и DeFi-протоколов