Отозвал апрувы в MetaMask после покупки NFT: личный урок
Покупка NFT — это не «раз — и картинка в кошельке». Каждый раз, когда вы подписываете сделку на маркетплейсе, вы параллельно выдаёте смарт-контракту площадки разрешение SetApprovalForAll.
Демид Красильников, Обозреватель и гид по криптограмотности·Обновлено: 28 июня 2026 г.·9 мин

Я проверял эту механику на своих деньгах. После одной тестовой сделки на небольшом маркетплейсе я не отозвал апрув — побоялся платить лишний газ, подумал «это же маленький контракт, кому он нужен». Через четыре недели этот контракт подвергся компрометации, и я увидел входящую транзакцию, которая пыталась перевести все мои NFT на сторонний адрес. Спасло то, что я не хранил там крупные суммы. Везение — скверный метод риск-менеджмента, но тогда отделался лёгким испугом.
Дальше — разбор по базе: что такое SetApprovalForAll, почему покупка NFT автоматически выдаёт доверенность, как увидеть выданные разрешения и отозвать их правильно.
SetApprovalForAll: как работает механизм делегирования прав
В сети Ethereum у каждого NFT есть два ключевых стандарта: ERC-721 (один токен = один уникальный актив) и ERC-1155 (полу-взаимозаменяемый, часто используется в играх и крупных коллекциях). В обоих стандартах есть функция `setApprovalForAll` — это метод, которым вы говорите контракту: «Эй, вот этот оператор может делать с моими токенами этого контракта всё что угодно от моего имени».
Представьте, что вы сдали ключ от банковской ячейки управляющей компании с формулировкой «можете забирать содержимое, когда сочтёте нужным». Доступ бессрочный, отзывается только отдельным заявлением. ERC-20 использует похожий, но более гибкий механизм через функцию `approve` — там вы указываете сумму, на которую разрешаете тратить. ERC-721 работает грубее: либо всё, либо ничего. `true` означает полный доступ, `false` — отзыв.
Важный нюанс, который путает новичков: апрув выдаётся не конкретному человеку, а конкретному смарт-контракту. Маркетплейс OpenSea — это набор контрактов с разными адресами (Seaport, Wyvern, старые версии). Каждый из них получает свой апрув. Если разработчики проекта обновляют контракт через прокси-механизм (а это распространённая практика в NFT), адрес остаётся прежним, но логика меняется. Ваш старый апрув продолжает действовать.
Апрув — это не подтверждение покупки. Это постоянное разрешение, которое действует до явного отзыва. Забыли отозвать — и любой, кто получит контроль над контрактом-оператором, получит контроль над вашими токенами.
Почему покупка NFT — это не только транзакция, но и выдача доверенности
Когда вы покупаете NFT через OpenSea, Blur, Magic Eden или любой другой крупный маркетплейс, под капотом происходит следующее: смарт-контракт маркетплейса вызывает `setApprovalForAll` от вашего имени. Это заложено в логику протокола — без этого механизма продавец не сможет автоматически снять ваш NFT при получении оплаты. Казалось бы, оправданно. Проблема в том, что вы подписываете эту транзакцию глазами, не понимая её смысла. В MetaMask всплывает окно с суммой, газом и кнопкой «Подтвердить». Визуально оно не отличается от обычной оплаты.
Что именно получает маркетплейс после вашего «Подтвердить»:
- Право передачи любого вашего NFT на любой адрес. Контракт-оператор может инициировать транзакцию `transferFrom` от вашего имени. Без вашего участия. Без дополнительных подписей.
- Право продажи через собственный протокол. Маркетплейс может выставить ваш NFT на вторичку, продать его, и вы получите деньги на свой же кошелёк. Вроде ничего криминального, но это происходит без уведомления.
- Доступ остаётся навсегда. Если вы купили NFT в 2022 году на Wyvern v1, а потом этот контракт признали устаревшим — апрув всё ещё висит. И если кто-то найдёт уязвимость в этом контракте, ваш токен уязвим.
Хуже того, фишинговые сайты маскируются под маркетплейсы и просят подписать тот же апрув, но на адрес мошенника. Открыли ссылку из Telegram, нажали «Mint» — и выдали доверенность не маркетплейсу, а скамеру. Дальше — стандартный сценарий: ночью ваш дорогой NFT уходит в никуда, и транзакция необратима.
Инструментарий для аудита: как увидеть все активные разрешения
Прежде чем что-то отзывать, нужно увидеть, что именно у вас «висит». Долгое время у MetaMask не было штатного инструмента для этого — приходилось лезть в сторонние сервисы. В 2023 году MetaMask добавил встроенный раздел, но работает он пока ограниченно. Поэтому практики используют связку из нескольких сервисов.
MetaMask Portfolio → Permissions (встроенный). Заходите в расширение, открываете Portfolio, переходите во вкладку «Permissions» или «Approvals». Показывает базовые апрувы для активов в вашем кошельке. Удобно для новичков, но неполно — отображает только часть сетей и не все типы разрешений.
Revoke.cash. Классика. Сайт показывает все апрувы с разбивкой по сетям: Ethereum, BNB Chain, Polygon, Arbitrum и другим. Подключаете кошелёк, видите таблицу с колонками «Контракт», «Тип разрешения», «Сумма или All», «Сеть». Для каждой строки — кнопка «Revoke». Самый понятный интерфейс для новичка, есть подсказки и предупреждения. Газ за отзыв платите сами — это обычная транзакция.
Etherscan → Token Approval (для Ethereum). Заходите на etherscan.io, вставляете свой адрес кошелька, переходите в раздел «Token Approvals» (прямая ссылка появляется автоматически). Видите те же апрувы, что и в Revoke, но с большей детализацией: дата выдачи, последняя транзакция по этому разрешению. Подходит тем, кто хочет копнуть глубже.
Beefy Allowance (allowance.beefy.finance). Альтернатива от команды Beefy Finance, тоже показывает апрувы в нескольких сетях. Интерфейс аскетичный, но функционально не уступает.
| Сервис | Сети | Стоимость проверки | Дополнительная аналитика | Удобство для новичка |
|---|---|---|---|---|
| MetaMask (Portfolio) | Ethereum, BSC и другие (постепенно расширяют) | Бесплатно, газ только за отзыв | Минимальная | Высокое |
| Revoke.cash | Более 20 сетей | Газ только за отзыв | Хорошая, с историей | Высокое |
| Etherscan Token Approval | Ethereum mainnet | Газ только за отзыв | Максимальная | Среднее |
| Beefy Allowance | Несколько сетей | Газ только за отзыв | Базовая | Среднее |
Я проверяю себя раз в две-три недели по двум сервисам: Revoke.cash для общей картины, Etherscan для аудита самых крупных активов. Перекрёстная проверка ловит глюки и несовпадения.
Пошаговый алгоритм отзыва: от Revoke.cash до Etherscan
Сам по себе отзыв — это та же транзакция в сети, только с нулевым или минимальным переводом. Платите только газ. Алгоритм выглядит так:
1. Подготовка кошелька. Убедитесь, что у вас есть немного ETH (или нативного токена сети) на оплату газа. Отзыв одного апрува стоит обычно от $0.5 до $3 в Ethereum mainnet в спокойное время, в часы пик бывает $10–$20. Если собрались чистить 20 разрешений подряд — закладывайте $30–$50.
2. Открываем Revoke.cash и подключаем кошелёк. Перейдите на revoke.cash, нажмите «Connect Wallet» (только прямой сайт, не через WalletConnect с рандомного домена). Выберите MetaMask. Подтвердите подключение в окне расширения.
3. Изучаем список. Сервис запросит разрешение только на чтение — подписи транзакций на этом этапе не нужны. Видите список всех контрактов, которым вы когда-либо выдавали доступ. Красным обычно подсвечиваются апрувы без лимита (`Unlimited` или `MaxUint256`) — это самые опасные, отзывайте в первую очередь.
4. Отзываем по одному. Нажимаете «Revoke» рядом с нужной строкой. Откроется окно MetaMask с параметрами транзакции: адрес контракта, функция, газ. Проверяйте, что функция действительно `setApprovalForAll` или `approve` со значением `0` (или `false`). Жмёте «Подтвердить».
5. Проверяем результат. После подтверждения транзакция уходит в сеть. Через 30 секунд — 5 минут (зависит от нагрузки сети) апрув должен исчезнуть из списка или его `allowance` (значение доступного лимита) станет равно нулю. Проверяете визуально на странице Revoke, дублируете через Etherscan, если нужно подтверждение.
6. Не забываем про чек-лист:
- Все «безлимитные» апрувы отозваны в первую очередь.
- После крупных сделок (покупка дорогого NFT, выход из пула, обмен через DEX) — чистка в тот же день.
- Апрувы на суммы, которые вы уже потратили и больше не нужны, — отзываются все.
- Оставлены только те разрешения, которые вы планируете использовать в ближайшие дни (например, апрув на DEX, через который торгуете каждый день).
Я отзываю апрувы не потому, что параноик. Я отзываю их потому, что цена ошибки в крипте — это весь мой счёт в этой строке. А отзыв стоит меньше чашки кофе.
Границы защиты: почему отзыв апрувов не спасает при утечке сид-фразы
Это раздел, в котором я обычно слышу «Спасибо, не знал». Потому что многие воспринимают отзыв апрувов как панацею. Это рабочий инструмент, но у него есть рамки применимости.
Если сид-фраза (12 или 24 слова, которые генерируются при создании кошелька) утекла — отзыв апрувов бесполезен. Злоумышленник с доступом к фразе может сам вызвать `setApprovalForAll` с любого оператора за несколько секунд. Он просто оформит новый апрув, выведет активы и уйдёт. Ваш отзыв погоды не сделает, потому что в его руках полный контроль.
Отзыв апрувов спасает в трёх сценариях:
- Вы подписали что-то подозрительное и хотите откатить «доверие». Подписали `setApprovalForAll` на фишинговом сайте, поняли через минуту — отзывайте сразу.
- Контракт маркетплейса, которым вы пользовались раньше, был скомпрометирован. Уязвимость на стороне проекта — ваш отзыв закрывает ваш конкретный кошелёк от атаки.
- Маркетплейс закрылся или вы им больше не пользуетесь. Зачем оставлять разрешение контракту, который больше не работает?
Отзыв апрувов не спасает:
- При утечке сид-фразы или приватного ключа. Контроль над кошельком = контроль над всеми будущими транзакциями, в том числе новыми апрувами.
- При компрометации самого устройства. Если на компьютере сидит кейлоггер или вредоносное расширение в браузере — оно может подписать что угодно уже после вашего отзыва.
- При подписании мошеннической транзакции, не связанной с апрувами. Например, `transferFrom` напрямую или подпись транзакции, которая выглядит как отзыв, но на деле — перевод активов.
Поэтому отзыв — это гигиена, а не серебряная пуля. Он снижает поверхность атаки, но не отменяет необходимость хранить сид-фразу в аппаратном кошельке (Ledger, Trezor), не вводить её на сайтах и не светить на скриншотах.
Как встроить отзыв в риск-менеджмент на постоянку
Я выработал для себя простое правило: после любой значимой сделки — чистка. Значимая — это покупка NFT стоимостью от $100, обмен через DEX крупной суммы, выход из пула ликвидности, покупка токена через новый для меня протокол. Не «вспомнил через полгода», а в тот же вечер или на следующий день. Занимает 10–15 минут, стоит копейки, снимает 90% нервных реакций вида «ой, а это нормально, что контракт X требует подписи?»
Параллельно я завёл себе отдельный «торговый» кошелёк в MetaMask, куда перевожу деньги только под конкретную сделку. На нём лежит ровно столько, сколько нужно для одной операции. Апрув выдаётся — сделка прошла — апрув отзывается — остаток возвращается на основной «холодный» адрес. Это неудобно для активной торговли, но для среднестатистического новичка, который покупает NFT не каждый день, — рабочая схема.
Если вы только начинаете осваивать крипту и у вас пока нет системного понимания, как устроены эти процессы, имеет смысл подойти к вопросу через структурированное обучение — базовые курсы длятся несколько недель и сразу закрывают дыры в понимании типа апрувов, газа, ликвидности и риск-менеджмента. Например, на Ursday Education собирают подборки образовательных программ для тех, кто хочет разобраться в крипте с нуля, а не по верхам из Telegram-каналов. Собственно, у меня и был личный урок — как проверить, что после первой крупной сделки в кошельке не осталось открытых дверей для старых контрактов. Этот навык входит в базу любого, кто планирует держать в крипте больше символической суммы.
Главный принцип простой: чем меньше «открытых дверей» в вашем кошельке, тем меньше сценариев, при которых вы теряете деньги. Отзыв апрувов — это закрытие дверей, которые вы сами открыли в моменте и забыли про них. Регулярная гигиена дешевле одного крупного слива — проверено на собственных нервах.