Подпись, которую нельзя отменить
Февраль 2025. Москвичка кликает на рекламу в Twitter — «BAYC сезон 2: бесплатный клейм». Сайт похож на OpenSea, просит подключить кошелёк и подписать сообщение «Подтвердить участие в дропе». Это setApprovalForAll на её ERC-721 контракт. Она подписывает.
Через четыре минуты три Bored Apes, один Pudgy Penguin и один Doodle уходят. Потеря по флору: 137 000 USD.
Что такое setApprovalForAll
Это один вызов на ERC-721 или ERC-1155 контракте, который даёт третьему адресу право переводить любой NFT этой коллекции, которым вы владеете сейчас или будете владеть в будущем — до отзыва. После одобрения оператор может вызвать transferFrom без вашего участия. Подпись в MetaMask не выглядит подозрительной — просто адрес контракта и слово «approve».
Три сигнала на экране подписи
- setApprovalForAll почти никогда не нужен для дропа. Реальные дропы используют функцию
claim(без одобрения) или прямойtransferFromот проекта (без подписи). Если страница клейма просит setApprovalForAll — закрывайте вкладку. - Адрес оператора должен быть тем контрактом, которому вы доверяете. Посмотрите, кому даёте одобрение. Если это случайный EOA, а не верифицированный маркетплейс — это адрес дрейнера.
- MetaMask с версии 11 показывает предупреждение. Красный баннер для high-risk-одобрений. Не нажимайте «всё равно подписать».
Если уже подписали
Срочно на revoke.cash или etherscan.io/tokenapprovalchecker. Подключите пострадавший кошелёк, найдите все одобрения не-маркетплейсам и отзовите. Каждый отзыв стоит 5–15 USD газа. Если дрейнер ещё не успел вывести NFT — можно спасти. Гонка обычно 5 минут, мобильное приложение быстрее десктопа.
Постоянное правило
Я проверяю одобрения на revoke.cash раз в месяц. Скриншот прошлого списка храню. Любое новое одобрение, которое я не помню сознательно — отзывается в тот же час.