Підпис, який не можна скасувати

Лютий 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 раз на місяць. Скриншот минулого списку зберігаю. Будь-яке нове схвалення, якого я свідомо не пам'ятаю — відкликається в той же час.