Что такое token approval на уровне контракта
Стандарт ERC-20 определяет функцию
approve(spender, amount), которая записывает в хранилище токена разрешение для указанного адреса (spender) списывать до amount единиц токена с баланса вызывающего. Это разрешение хранится в маппинге allowance[owner][spender] внутри контракта токена и не привязано к сессии, браузеру или кошельку — оно существует на уровне состояния блокчейна.Когда DEX, лендинг-протокол или любой другой смарт-контракт просит «подключить кошелёк и подтвердить транзакцию», за этим обычно стоит вызов
approve. После подтверждения контракт получает право вызывать transferFrom(owner, recipient, amount) и перемещать токены с вашего адреса без повторного запроса.Ключевые свойства approval:
- Не имеет срока действия. Разрешение, выданное сегодня, будет активно и через пять лет, если его не отозвать.
- Не привязано к балансу. Даже если вы вывели все токены с платформы на свой кошелёк, контракт с активным approval может списать токены в любой момент, когда они снова появятся на адресе.
- Не отменяется отключением кошелька. Кнопка «Disconnect» на сайте убирает только UI-сессию. Запись в
allowanceостаётся в блокчейне.
Почему unlimited-разрешения создают риск
Большинство DeFi-протоколов по умолчанию запрашивают
approve на максимальное значение uint256 (часто отображается как Unlimited или ∞). Мотивация понятна: пользователю не нужно платить gas за повторный approve при каждой операции. Но это означает, что контракт получает неограниченный доступ ко всему балансу токена на вашем адресе.Сценарии, при которых unlimited-approval приводит к потере средств:
- Уязвимость в контракте. Если в коде протокола обнаружен баг, атакующий может вызвать
transferFromи вывести токены всех пользователей, выдавших разрешение.
- Вредоносный контракт. Злонамеренный разработчик может встроить бэкдор, который списывает токены через некоторое время после взаимодействия.
- Компрометация приватного ключа разработчика. Если ключ деплоера украден, а контракт имеет upgradeable-прокси, логика может быть заменена на вредоносную.
Во всех трёх случаях пользователь не получает уведомления и не может отменить транзакцию после её подтверждения в блоке.
Как проверить активные approvals
Существует несколько инструментов, которые читают состояние
allowance для вашего адреса и выводят список контрактов с активными разрешениями:| Инструмент | Поддерживаемые сети | Особенности |
|---|---|---|
| Etherscan (Token Approvals) | Ethereum Mainnet | Встроен в блок-эксплорер, показывает лимит и контракт |
| Blockscout | Ethereum и совместимые сети | Открытый эксплорер с аналогичной функцией |
| Revoke.cash | Несколько сетей (Ethereum, Polygon, Arbitrum, BSC и др.) | Специализированный интерфейс для отзыва |
| Unrekt | Несколько сетей | Агрегатор с проверкой на известные эксплойты |
| EverRevoke | Несколько сетей | Поддержка множества EVM-совместимых цепочек |
Общий принцип работы с любым из этих инструментов:
- Подключите кошелёк (обычно через WalletConnect или инъекцию провайдера).
- Убедитесь, что выбрана правильная сеть. Approvals в Ethereum Mainnet и в Polygon — это разные записи в разных блокчейнах.
- Инструмент отобразит список контрактов, для которых
allowance > 0, с указанием токена, лимита и адреса контракта.
Как отозвать разрешение
Отзыв approval — это транзакция, которая вызывает
approve(spender, 0) для конкретного контракта и токена. По сути вы перезаписываете значение allowance на ноль.Пошаговый процесс:
- Откройте один из перечисленных инструментов и подключите кошелёк.
- Найдите в списке контракт, доступ которого хотите отозвать.
- Нажмите кнопку «Revoke» (или аналогичную).
- Кошелёк предложит подтвердить транзакцию. Это обычная on-chain транзакция, которая требует оплаты gas.
- Дождитесь подтверждения (обычно от нескольких секунд до пары минут в зависимости от загрузки сети).
- Обновите страницу инструмента и убедитесь, что контракт исчез из списка или лимит стал равен нулю.
Стоимость отзыва
Каждый отзыв — отдельная транзакция. Если у вас 20 активных approvals в Ethereum Mainnet, потребуется 20 транзакций. При высоком gas price это может быть ощутимо. В L2-сетях (Arbitrum, Optimism, Base) стоимость значительно ниже.
Что не происходит при отзыве
- Стейкинг, пулы ликвидности и лендинг-позиции не закрываются. Отзыв approval не влияет на средства, уже заблокированные в контракте. Вы остаётесь в позиции и продолжаете получать вознаграждения.
- Баланс токена не меняется. Отзыв убирает только право контракта списывать токены в будущем.
- NFT-approvals работают аналогично. Для ERC-721 и ERC-1155 существуют свои механизмы (
setApprovalForAll,approve), и их отзыв происходит тем же способом через те же инструменты.
Типичные ошибки
Отключение кошелька вместо отзыва. Кнопка «Disconnect wallet» на сайте dApp не отзывает approval. Это распространённое заблуждение: пользователь думает, что раз кошелёк отключён, контракт больше не имеет доступа. На деле запись в
allowance сохраняется.Проверка только в одной сети. Если вы взаимодействовали с протоколом в Polygon, Arbitrum и Ethereum Mainnet, approvals существуют в каждой из этих сетей отдельно. Нужно проверять и отзывать в каждой.
Игнорирование старых approvals. Разрешения, выданные год или два назад, всё ещё активны. Если протокол с тех пор не аудировался или сменил команду, риск возрастает.
Одобрение на сумму больше необходимой. Если вы меняете 100 USDC на DEX, нет смысла давать unlimited-approval. Некоторые кошельки позволяют вручную указать сумму при подписании транзакции approve.
Практики снижения риска
- Ограничивайте сумму approve. Если кошелёк позволяет отредактировать значение перед подписанием, указывайте только необходимый объём. При следующей операции потребуется повторный approve, но это осознанный trade-off между удобством и безопасностью.
- Регулярно проводите аудит approvals. Раз в несколько недель проверяйте список активных разрешений и отзывайте те, которые больше не нужны.
- Не взаимодействуйте с непроверенными контрактами. Если проект новый, не прошёл аудит и просит unlimited-approval — это красный флаг.
- Читайте данные транзакции перед подписанием. Кошелёк показывает, какой метод вызывается и с какими параметрами. Если видите
approveсamount = 2^256 - 1(unlimited), оцените, доверяете ли вы этому контракту.
- Используйте аппаратный кошелёк для крупных сумм. Даже если approval скомпрометирован, для его использования атакующему нужно, чтобы токены находились на адресе. Холодное хранение основной части средств снижает потенциальный ущерб.
Чек-лист перед взаимодействием с новым dApp
- Проверьте, запрашивает ли контракт unlimited-approval или конкретную сумму.
- Убедитесь, что проект имеет публичный аудит смарт-контрактов.
- Оцените, сколько токенов реально нужно для операции, и ограничьте approve этой суммой.
- После завершения работы с протоколом отзовите approval, если не планируете возвращаться.
- Зафиксируйте дату и сеть, в которой выдали разрешение, чтобы не потерять его при будущем аудите.
