Revoke token approvals: как отозвать разрешения токенов и зачем

Что такое token approval и почему это риск, как разрешение превращается в слив, как посмотреть и отозвать разрешения токенов и чего отзыв не исправит.

Редакция CoinDropster · Обновлено:

Revoke token approvals — это действие, которое стоит выполнять так же регулярно, как проверку баланса, если ты участвуешь в аирдропах. Каждый свап, стейк и депозит оставляет после себя разрешение: право контракта распоряжаться твоими токенами. Эти разрешения не истекают сами. Отозвать разрешения токенов — значит закрыть каналы, по которым средства могут уйти без твоей новой подписи, и эта статья объясняет, как они возникают, как их увидеть и когда отзыв не поможет.

Здесь описана механика разрешений в EVM-совместимых сетях и общие инструменты для их ревизии. Это не исчерпывающая инструкция по безопасности и не финансовый совет: отзыв снижает риск, но не устраняет его полностью.

Что такое token approval

Токены стандарта ERC-20 (и NFT стандартов ERC-721/1155) не могут быть «взяты» контрактом сами по себе. Чтобы DEX обменял твои USDC, а пул принял твою ликвидность, ты сначала должен разрешить контракту забирать токены с твоего адреса — это и есть approval. Технически это транзакция approve(spender, amount), которая записывает в контракт токена: адрес spender может списать до amount единиц.

Проблема в двух свойствах. Во-первых, интерфейсы по умолчанию запрашивают неограниченную сумму (max uint256), чтобы не просить разрешение при каждой операции. Во-вторых, разрешение бессрочно: оно живёт, пока ты его не перезапишешь. Через год после того, как ты один раз воспользовался протоколом, его контракт всё ещё имеет право списать весь твой баланс этого токена.

Отдельно — подписи permit и permit2: разрешение выдаётся оффчейн-подписью, без транзакции, и появляется в сети только тогда, когда его использует spender. Это удобнее и дешевле, но ещё менее заметно.

Как approval превращается в слив

Сценариев несколько, и не все связаны с мошенничеством:

  • Фишинговый сайт. Ты подписал approve на контракт дрейнера, думая, что это клейм или минт. Дрейнер вызывает transferFrom и забирает всё, на что получил разрешение. Как выглядят такие сайты — в статье о фейковых сайтах клейма.
  • Уязвимость в легитимном контракте. Протокол, которым ты пользовался, взломан. Атакующий получает возможность вызывать transferFrom от имени контракта — и списывает у всех, кто оставил неограниченное разрешение. Это происходило с крупными протоколами неоднократно.
  • Обновляемый контракт. Прокси-контракт, чью логику можно заменить. Если команда или тот, кто получил ключи, поменяет реализацию, старое разрешение продолжит действовать для нового кода.
  • Заброшенный протокол. Проект закрылся, домен истёк, ключи администратора где-то лежат. Разрешение всё ещё активно.

Общее во всех случаях: списание происходит без твоей новой подписи. Ты не увидишь запроса в кошельке — только исходящую транзакцию в истории.

Как посмотреть и отозвать разрешения

Разрешения хранятся в контрактах токенов, поэтому кошелёк их обычно не показывает. Нужны внешние инструменты:

  1. Сервисы ревизии разрешений. Например, revoke.cash: подключаешь кошелёк или просто вводишь адрес, сервис показывает все активные approvals по сетям — токен, spender, сумму, дату выдачи. Отзыв — это транзакция approve(spender, 0), которую сервис формирует за тебя. Такие сервисы существуют не только для EVM-сетей; принцип одинаков.
  2. Эксплореры. У большинства блокчейн-эксплореров есть раздел «Token Approvals» (Approval Checker), который делает то же самое без стороннего сайта.
  3. Вручную. Вызвать approve с нулевой суммой на контракте токена через интерфейс эксплорера. Дольше, но не требует доверия никакому фронтенду.

Что важно при отзыве: это транзакция, она стоит газа, и делать её нужно в той сети, где выдано разрешение. Отзыв permit-подписей, которые ещё не использованы, работает иначе: нужно либо инвалидировать nonce, либо отозвать разрешение на сам контракт permit2, — сервисы ревизии обычно показывают и это. И сначала проверь, что сервис, которым ты отзываешь, — настоящий: фейковые «revoke-сайты» существуют и просят ровно ту подпись, от которой ты хочешь избавиться.

Рутина отзыва между кампаниями

Отзыв — это не разовое действие после инцидента, а привычка. Разумный график:

  • После завершения кампании. Проект перешёл в Distributed, ты забрал токены — отзови разрешения на его контракты и на всё, что подключал ради его чек-листа.
  • После клейма. Сайт клейма мог запросить разрешения, которые не нужны для получения токенов. Проверь сразу.
  • Раз в несколько недель. Общая ревизия по всем сетям, где активен кошелёк. Особое внимание — неограниченным разрешениям и spender-адресам, которые ты не узнаёшь.
  • Перед крупным переводом на кошелёк. Если ты собираешься держать на адресе больше обычного, сначала убедись, что на него нет активных разрешений.

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

Что отзыв не исправит

Отзыв разрешений закрывает один конкретный вектор — списание через approve/permit. Он не помогает в ситуациях, которые с ним путают:

  • Утёкшая сид-фраза или приватный ключ. Владелец сида — полноценный владелец кошелька. Он может выдать новые разрешения, перевести средства напрямую, отозвать твои отзывы. Единственное решение — новый кошелёк с новым сидом и перенос всего, что осталось.
  • Уже выполненный перевод. Если transferFrom уже прошёл, отзыв защищает только остаток. Ушедшее не возвращается.
  • Нативный токен сети. ETH, BNB и аналоги не требуют approve. Их можно потерять только прямой транзакцией, которую ты подписал сам, — отзыв здесь не при чём.
  • Делегирование аккаунта. В сетях, где аккаунт может делегировать выполнение кода другому контракту, отзыв разрешений на токены не отменяет делегирование. Это отдельная настройка.
  • Скам-токены в кошельке. Токены, которые «прилетели» сами, безвредны, пока ты не взаимодействуешь с ними. Отзывать на них нечего; просто не трогай их и не переходи по ссылкам из их названий.

Итог: отзыв разрешений — обязательная, но не единственная часть гигиены. В связке с отдельным кошельком, проверкой ссылок и чтением того, что подписываешь, он делает участие в аирдропах занятием с ограниченным риском. Статусы проектов, после которых имеет смысл провести ревизию — Reward available и Distributed, — отслеживаются на CoinDropster. Смотреть отслеживаемые аирдропы →