Ревокация и аудит старых approve: ревизия разрешений кошелька
Представьте: вы аккуратно держите 0,8 ETH и пару тысяч долларов в стейблах, аппаратный кошелёк куплен, сид-фраза никогда не касалась интернета. А потом в один день баланс обнуляется — не потому, что вы подписали что-то плохое сегодня, а потому, что три года назад выдали unlimited approve сомнительному свапу ради экономии $2 на газе. Контракт ждал, пока на адресе появится «жирная» сумма.
Механика тут простая и от этого страшная: approve в EVM-сетях — это не разовый перевод, а постоянная доверенность. Пока вы её не отозвали, контракт может списать токены в пределах лимита в любой момент — через день или через пять лет. Забытые разрешения — одна из самых недооценённых зон риска у крипто-держателей, потому что атаковать не нужно: доступ уже выдан вами лично.
Хорошая новость: аудит и ревокация разрешений занимают 30–40 минут раз в квартал и стоят копейки. В этой статье — пошаговый процесс ревизии, инструменты, расчёт расходов и чек-лист, который стоит повторять по календарю.
Почему approve — это дверь, которую вы забыли закрыть
Когда вы меняете токены на DEX, даёте токены в лендинг или минтите NFT, вы почти всегда подписываете две транзакции: approve (разрешение контракту тратить ваши токены) и собственно действие. Проблема в двух вещах.
Первое — лимит. Многие интерфейсы по умолчанию предлагают infinite approval: «безлимит» на весь баланс токена. Разработчики делают это, чтобы вам не пришлось платить газ за повторные approve. Удобно? Да. Но если контракт окажется скомпрометированным (а взламывают даже известные протоколы — в 2022–2023 годах через скомпрометированные ключи или баги контрактов уходили десятки миллионов долларов), атакующие получают доступ ко всем токенам этого типа на вашем адресе.
Второе — забывчивость. Разрешения не имеют срока действия. Кошелёк, которым вы пользовались в 2021 году для одной сделки на Uniswap, до сих пор хранит выданный тогда доступ. Средний активный адрес за 3–4 года накапливает 20–80 активных approve, из которых реально нужных — три-пять.
Правило: каждое разрешение, которое вы не используете прямо сейчас, — это бесплатная опция для злоумышленника. Не пользуетесь — отзывайте.
Шаг 1. Инвентаризация: смотрим, что уже выдано
Начните с полной картины. Для этого не нужен блокчейн-эксплорер вручную — есть специализированные сервисы:
- Revoke.cash — самый популярный инструмент. Подключаете кошелёк, выбираете сеть, видите список всех approve и ERC-20 permits с суммами и датами.
- Etherscan Token Approval Tool — официальный инструмент эксплорера, хорош для Ethereum mainnet.
- DeBank / Zapper — показывают разрешения в связке с общим портфелем, удобно для мультивселенной.
Проверьте каждую сеть, где у вас есть активы: Ethereum, Arbitrum, Base, Optimism, Polygon, BNB Chain. Разрешение в сети, где осталось $50, — тоже риск: если пополните адрес позже, старый approve «проснётся».
На выходе у вас должен быть список вида: контракт — токен — лимит — дата. Экспортируйте или сделайте скриншот — это ваша базовая линия для следующих аудитов.
Шаг 2. Сортировка: что отзывать, что оставить
Пройдитесь по списку и разложите на три категории.
Оставить:
- разрешения протоколам, где у вас лежат позиции прямо сейчас (например, approve на стейбл для лендинг-протокола, где размещены средства);
- разрешения, которые вы используете чаще раза в месяц.
Отозвать немедленно:
- всё, чем не пользовались более 6 месяцев;
- контракты, которые не узнаёте или не можете вспомнить, зачем одобряли;
- любые разрешения «мемных» токенов, аирдроп-клеймеров, мост-сервисов разового использования;
- разрешения на токены, баланс которых вы собираетесь пополнять.
Понять и решить:
- дублирующиеся approve одному протоколу (старая и новая версии контракта) — старую версию отзываем;
- безлимитные approve на крупные суммы — даже если протокол надёжный, подумайте о замене на лимитированные.
Практический ориентир: после первой ревизии у большинства людей остаётся 3–7 активных разрешений вместо изначальных 30+. Это и есть целевое состояние.
Шаг 3. Ревокация: как и почём
Ревокация — это обычная транзакция: она вызывает метод approve(адрес, 0) в контракте токена. То есть стоит как обычный перевод токена.
Разберём на конкретном примере. Допустим, у вас 12 забытых approve в сети Arbitrum и 6 в Ethereum mainnet:
- Arbitrum: комиссия сейчас в среднем 0,01–0,05 USD за транзакцию. 12 ревокаций × ~$0,03 = ~$0,36 (примерно 30–35 рублей).
- Ethereum mainnet: при газе 15–25 gwei перевод токена стоит $2–5. 6 ревокаций × $3 = $18 (около 1600–1800 рублей).
Итого полная чистка: около $18,5, то есть примерно 1700–1900 рублей. Сравните с риском: одна скомпрометированная позиция на $5000 — это порядка 450 000–500 000 рублей. Соотношение «цена страховки / возможный ущерб» здесь — примерно 1 к 250.
Как сэкономить на mainnet:
- ревоцируйте в выходные или ночью по UTC, когда газ ниже;
- начните с токенов, где у вас максимальные балансы, — остальное можно отложить;
- сначала чистите L2, где это почти бесплатно, а mainnet-очистку делайте партиями по мере необходимости.
Важный момент безопасности: ревокацию делайте через Revoke.cash или Etherscan, подключив кошелёк напрямую к официальному сайту (проверяйте URL буква за буквой — revoke.cash с одним «k»). Существуют фишинговые клоны таких сервисов. Идеально — холодный кошелёк: подпись ревокации безопасна, сид-фраза никуда не вводится.
Чек-лист регулярного аудита
Превратите ревизию в рутину — как проверку зубов. Рабочий чек-лист:
- [ ] Раз в квартал: полный проход по Revoke.cash во всех активных сетях.
- [ ] После каждой новой операции с незнакомым протоколом: тут же решите — оставить разрешение или отозвать сразу после сделки.
- [ ] Перед пополнением «спящего» адреса крупной суммой: ревизия его разрешений до перевода.
- [ ] При каждом approve в кошельке: выбирайте лимитированную сумму вместо unlimited, если интерфейс позволяет.
- [ ] Раз в полгода: проверяйте, не анонсировали ли протоколы, чьи разрешения у вас активны, инциденты или миграцию контрактов.
- [ ] Ведите короткую таблицу «протокол — зачем одобрен» — будущий аудит сократится с 40 минут до 10.
Частые ошибки, которые сводят аудит на нет
- Ревокация с горячим кошельком, «просто проверить сервис». Подключайте только тот адрес, который аудируете, и только к официальному домену.
- Чистка только mainnet. 80% повседневной активности уходит в L2 — риски там те же, а цена ревокации в сто раз ниже. Странно чистить дорогое и игнорировать дешёвое.
- «Протокол большой, ему можно доверять безлимит». Размер не гарантия: у крупных были инциденты. Unlimited approve оправдан разве что для токенов, на которых вы держите копейки.
- Ревокация «по диагонали». Отозвали половину, устали, бросили. Доревокациируйте в следующий слот по календарю — но список незакрытых позиций зафиксируйте.
- Забыть о ERC-20 permit-подписях. Это разрешения, выданные подписью (off-chain), без транзакции. Revoke.cash их показывает отдельно — проверяйте обе вкладки.
FAQ
Ревокация approve вернёт мне уже потраченные токены? Нет. Ревокация только закрывает доступ на будущее. Если контракт уже списал токены мошенническим путём, шансы вернуть средства близки к нулю — поэтому аудит и делают до инцидента, а не после.
Может ли ревокация навредить моим текущим позициям в DeFi? Да, если отозвать разрешение, на котором держится активная позиция (например, collateral в лендинге — хотя там чаще используется депозит, а не approve). Поэтому сортировка из шага 2 обязательна: отзываем только то, чем не пользуемся. Если сомневаетесь — сначала проверьте позиции протокола в его интерфейсе.
Как часто на самом деле нужен аудит? Минимум — раз в квартал, плюс внеплановые проверки: после работы с новыми протоколами и перед пополнением адресов крупными суммами. Если вы почти не совершаете on-chain операций, достаточно двух раз в год. Времени это занимает 30–40 минут, а закрывает один из немногих рисков, где защита полностью в ваших руках.