Подпись транзакций: что вы одобряете в кошельке на самом деле
Каждый день кто-то теряет криптовалюту не из-за взлома биржи и не из-за украденной seed-фразы. Причина банальнее: человек сам подписал транзакцию, которая отдала смарт-контракту право тратить его токены. Нажал «Confirm», увидел знакомый интерфейс, поверился — и через день, неделю или месяц обнаружил пустой кошелёк.
Механизм называется approve (одобрение). Это не bug, а фундамент DeFi: чтобы обменять токен на DEX или внести его в стейкинг, вы должны разрешить контракту списывать этот токен с вашего адреса. Проблема в том, что по умолчанию кошельки просят одобрить неограниченный лимит, а пользователь в момент подписки этого не понимает.
В этой статье разберём, как читать окно подтверждения, чем опасен unlimited approve, и как за 5 минут отозвать старые разрешения — до того, как ими воспользуется кто-то другой.
Что такое approve и почему это опасно
Стандарт ERC-20 разрешает токену хранить «карту доверия»: кто и сколько ваших токенов может переводить. Вызов approve(адрес, сумма) записывает в сам токен-контракт разрешение для указанного адреса. Ключевой момент: разрешение живёт в токен-контракте, а не в кошельке. Вы можете поменять кошелёк, устройство, пароль — одобрение продолжит действовать, пока вы его не отзовёте.
Опасность в двух сценариях:
- Скам-контракт. Фейковый сайт или «аирдроп» просит подписать approve на ваш USDT. Через час скамер вызывает
transferFromи уводит всё. - Взлом легитимного протокола. Даже если вы доверяли DEX, его контракт могли взломать — и все старые одобрения станут дверью к вашим средствам.
Правило: каждая подпись approve — это доверенность на списание. Подписали на unlimited — выдали генеральную доверенность навсегда, пока сами её не отзовёте.
Как читать окно подтверждения
Метамаск показывает минимум, но и этого достаточно, чтобы не попасться.
Что смотреть в деталях транзакции
- Request permission to access your X tokens — это approve. Дальше читаем внимательно.
- Spend limit:
unlimited— красный флаг. Конкретное число (например, 250 USDT) — приемлемо. - Interacting with — адрес контракта. Сверьте первые и последние 6 символов с официальным сайтом протокола. Не с результатом Google-поиска, а с доменом, который вы знаете.
- Function called:
approve,transferFrom,setApprovalForAll— всё, что связано с доступом к вашим активам.
setApprovalForAll — отдельная история: так отдают всю коллекцию NFT целиком. Если не понимаете, зачем это нужно интерфейсу, — закрывайте окно.
Практический пример с цифрами
Допустим, у вас 1 500 USDT (примерно 138 000 ₽ по курсу 92 ₽). Вы заходите на новый DEX менять 100 USDT на ETH. Кошелёк показывает: approve, spend amount: unlimited. Вы подписали.
Математика: DEX нужен доступ к 100 USDT (≈9 200 ₽). Вы дали доступ к 1 500 USDT (≈138 000 ₽). Избыточный риск — 1 400 USDT, или 128 800 ₽, которые вы не собирались тратить. Если контракт DEX взломают через 8 месяцев (средний срок жизни уязвимости до обнаружения — от полугода), скамер заберёт весь баланс одним вызовом. Потеря: 100% портфеля вместо нуля.
Решение: в MetaMask (версии 12+) на экране approve нажмите «Edit permission» и введите точную сумму — 100 USDT. Лишние 5 секунд против риска на 128 800 ₽.
Чек-лист перед подписью
- [ ] Это approve или обычный перевод? Если approve — читаем дальше.
- [ ] Spend limit конкретный, не unlimited (или отредактирован вручную).
- [ ] Адрес контракта сверен с официальным доменом.
- [ ] Сайт открыт по закладке, а не по ссылке из чата/поиска.
- [ ] Понятно, какая функция вызывается и зачем.
- [ ] Для NFT: нет
setApprovalForAllбез явной необходимости.
Хотя бы один пункт не сходится — не подписывайте. Никакой аирдроп не стоит кошелька.
Как отозвать старые одобрения
Существующие approve — это мины, оставшиеся от прошлых экспериментов с DeFi. Чистить их стоит раз в квартал.
Порядок действий:
- Зайдите на revoke.cash или etherscan.com/tokenapprovalchecker (для Ethereum; аналоги есть почти для всех сетей).
- Подключите кошелёк через отдельный режим браузера или, лучше, view-only: вставьте свой адрес вручную — подписывать ничего не нужно.
- Отсортируйте одобрения по сумме. Признаёте контракт (Uniswap, Aave) — можно оставить. Не помните или сумма большая — жмите Revoke.
- Каждая revoke-транзакция стоит газ: в Ethereum это 30 000–65 000 gas, при цене газа 15 gwei и ETH ~300 000 ₽ — примерно 135–295 ₽ за отзыв. В L2 (Arbitrum, Base) — копейки, доли рубля.
- Отзывайте крупное в первую очередь: приоритет — одобрения на thousands of долларов и все
setApprovalForAllдля NFT.
Типичные ошибки, которые costing деньги
- Подписать unlimited approve «чтобы потом не платить газ повторно» — экономия пары сотен рублей против риска всего баланса.
- Сверять адрес по первым 4 символам — скамеры делают vanity-адреса с совпадающим началом.
- Подписывать что-либо на сайте, куда пришли из Telegram-«поддержки» или рекламного объявления.
- Думать, что после вывода средств с сайта одобрение исчезло. Не исчезло — оно в токен-контракте.
- Хранить рабочий баланс и «экспериментальный» в одном кошельке. Подписываете эксперименты burner-кошельком, основной — холодный.
FAQ
Что произойдёт, если я отзову approve, которым пользуюсь? Ничего страшного: протокол просто попросит подписать новый approve при следующей операции. Это одна дополнительная транзакция за 135–295 ₽ — небольшая цена за закрытый вектор атаки.
Безопасно ли вообще использовать unlimited approve на крупных DEX? Это риск-менеджмент, а не бинарный выбор. Uniswap или Curve вряд исчезнут завтра, но история показывает взломы даже крупных протоколов (например, инциденты с роутерами в 2021–2023 годах). Правило простое: unlimited — только на кошельке с суммой, которую не жалко, на основном кошельке — точные лимиты.
Проверяет ли MetaMask контракты на скам автоматически? Частично: кошелёк показывает симуляцию транзакции и предупреждения, но финальное решение за вами. Не полагайтесь на встроенные подсказки — сверяйте адрес и лимит вручную. Антивируса для подписей не существует, ваша внимательность — последний рубеж.