Що таке схвалення токена насправді
У мережі на кшталт Ethereum токени — USDT, USDC — це кожен окремий контракт, який веде свій облік. Коли ви хочете обміняти USDT на ETH на DEX на кшталт Uniswap, виникає затримка: контракт Uniswap не може просто списати USDT з вашого рахунку, у нього немає на це прав.
Тому стандарт ERC-20 розбиває дію на два кроки. Спершу ви викликаєте в контракту токена approve(spender, amount) — це каже контракту USDT: «я дозволяю ось цій адресі Uniswap рухати з мого рахунку не більше стількох-то USDT». Потім, коли Uniswap проводить обмін, він викликає transferFrom і списує токени. Перший крок — це схвалення, другий — уже сама витрата.
На цьому механізмі тримається вся DeFi: обміни на DEX, депозити в кредитні протоколи, переказ токенів між мережами через міст — майже скрізь під капотом є approve. Проблема у двох місцях: сума схвалення та його термін життя. Думати про них вас ніхто не змушує, а дефолт гаманця зазвичай робить за вас найлінивіший і найнебезпечніший вибір.
Чому безлімітний апрув — головна лазівка
Коли більшість dApp показують запит approve, підставлена сума — це не «та дрібниця, яку ви міняєте просто зараз», а максимальне значення uint256, тобто фактично безліміт. Логіка прагматична: схвалив безліміт один раз — і більше не треба підписувати approve для цього токена, досвід лишається гладким. Розплата в тому, що ви віддали контракту-spender контроль над усім балансом цього токена й над усім, що колись на нього зайде в майбутньому.
Головне — термін життя: схвалення не спливає саме. Безлімітний апрув, який ви видали якомусь протоколу три роки тому заради одного обміну, чинний і сьогодні. Того дня, коли той контракт зламають — або якщо він із самого початку був фішинговим і чекав моменту, — атакувальнику досить один раз викликати transferFrom, і баланс цього токена йде весь і одразу: ні приватного ключа не треба, ні нового підпису, бо ви все підписали дуже давно.
Безлімітний апрув плюс зламаний контракт — це класичний ончейн-сценарій «втратити кошти уві сні». Більшість тих, кого спустошили, не попалися на фішинг саме того дня — схвалення, видане задовго до цього, нарешті спрацювало проти них. Це не те саме, що витік приватного ключа: при витоку ключа втрачається вся адреса, а при зловживанні схваленням ви зазвичай втрачаєте лише той токен, який було схвалено. Але видайте безлімітні апруви десятку протоколів — і ви прорубали в одній стіні десяток дверей.
Чого насправді хочуть шахраї: ваших схвалень
Щойно ви розумієте механізм схвалень, величезний пласт гаманцевих розводів раптом стає зрозумілим: їм потрібен не ваш приватний ключ, вони розводять вас на підпис схвалення чи еквівалентного підпису. Саме тому трапляється те саме «я нікому не казав seed-фразу, як же я втратив кошти?» — ви не зливали seed, ви просто один раз підписали не те схвалення. Ми розбирали кілька реальних кейсів на сайті, і наживка скрізь та сама — цей самий крок зі схваленням:
- Фейковий ейрдроп, що заманює вас підписати фішингову пастку з setApprovalForAll — перемикач «схвалити все» для NFT, після підпису якого вся колекція опиняється в розпорядженні атакувальника.
- Сторінка під виглядом нормальної DEX, що ховає підроблений обмін через Permit EIP-2612 — ви думаєте, що підписуєте звичайний обмін, а насправді підписуєте офчейн-схвалення.
- Пастка з permit у bid на Blur, вшита в процес виставлення оферти на NFT-маркетплейсі, — нешкідливий на вигляд «підпис лістингу», який тихо виводить схвалення.
- Підроблений підпис Permit2, що видає себе за Uniswap, — націлений рівно на той механізм Permit2, про який мова нижче.
Спільне в цих кейсів — мить підпису: у попапі або незрозумілий hex, або все акуратно загорнуто під «звичайну операцію». Захист від них — це не лише «не клікати що завгодно», а й розуміння того, що саме ви схвалюєте, і зачистка зайвих схвалень потім. Першу частину — як увімкнути розбір підпису — ми розбирали в Налаштуваннях безпеки MetaMask для щоденної роботи; перевірка та відкликання — тема цього гайда.
Крок перший · знайти свої наявні схвалення
З пам’яті свої схвалення ви не перелічите — у того, хто в темі рік-два, список зазвичай лячно довгий. Хороша новина: схвалення — це публічні ончейн-дані, подивитися може будь-хто. Найчастіше використовують три типи інструментів:
Чекери схвалень у блок-експлорерах
В Ethereum це Etherscan, у BNB Chain — BscScan, в обох вбудований Token Approval Checker (адреса виду etherscan.io/tokenapprovalchecker). Вставте адресу — і він виведе всі ERC-20 / ERC-721 схвалення, які ця адреса видала: хто spender, який розмір allowance, для якого токена. Безлімітні схвалення позначаються як Unlimited, тож їх видно одразу.
Це найавторитетніше джерело — дані йдуть прямо з самого ланцюга. Мінус у тому, що все по мережах: Etherscan бачить лише мейннет Ethereum, а ваші схвалення в Arbitrum, Optimism чи Base треба перевіряти в їхніх експлорерах. Пройдіть по кожній мережі, якою ви користувалися, окремо — не перевіряйте один мейннет і не вважайте, що все чисто.
Агрегатори на кшталт revoke.cash
revoke.cash — найходовіший сторонній інструмент у цій царині, він збирає схвалення з кількох мереж в один інтерфейс: під’єднайте гаманець або вставте адресу — і він підтягне весь набір ваших схвалень по мережах, відсортований за сумою та датою останнього використання, позначивши безлімітні й ті, до яких ви давно не торкалися. Можна навіть запустити відкликання прямо тут, не повертаючись в експлорер викликати контракт руками.
Перевірка схвалень — лише читання: вставити адресу для запиту не вимагає ні під’єднання гаманця, ні підпису — це безпечно. Під’єднання гаманця, підпис і gas потрібні лише на кроці самого відкликання. Тому «спершу перевірити, вирішити, що відкликати, потім під’єднатися й діяти» — порядок безпечніший. Заходячи на такі інструменти, обов’язково набирайте офіційний домен вручну або користуйтеся закладкою — не переходьте з реклами в пошуку чи з посилання у Twitter. Підроблені сайти живуть саме з цього.
Вбудований менеджер схвалень у гаманці
Багато гаманців сьогодні вже несуть власну панель схвалень. MetaMask у версіях після 11.x дає змогу побачити частину схвалень у деталях токена чи в меню безпеки й відкликати їх прямо там; низка мобільних гаманців сховала схожий вхід у «Налаштування / Безпека». Вбудовані інструменти виграють тим, що не треба виходити з гаманця, але покривають вони, як правило, менше мереж і токенів, ніж спеціалізовані. Сам я в щоденці швидко зиркаю на вбудовану панель, а при періодичному великому прибиранні звіряюся з експлорером плюс revoke.cash.
Крок другий · як відкликати
Передусім запам’ятайте: відкликання — це теж ончейн-транзакція, і за неї платять gas. Це не налаштування, яке тицяєш на сайті, — це справжня транзакція в мережу, що переписує allowance, записану в контракті токена. Тому перед відкликанням переконайтеся, що в гаманці є трохи нативної монети мережі (ETH, BNB тощо) на комісію. На прикладі revoke.cash — в інших інструментів потік майже такий самий:
- Під’єднайте гаманець і переконайтеся, що мережа, показана у правому верхньому кутку, — це та мережа, чиї схвалення ви хочете чистити. Мереж кілька — перемикайтеся й обробляйте кожну по черзі.
- Виберіть у списку spender’ів на відкликання. У пріоритеті три типи: усе з allowance Unlimited, усе, що використовувалося дуже давно, і будь-який контракт, чиє ім’я ви взагалі не впізнаєте.
- Натисніть Revoke — гаманець покаже запит транзакції. Тут ви підписуєте — прочитайте, що він збирається зробити, перш ніж підписати. Нормальне відкликання ставить allowance у 0 або повертає setApprovalForAll у false.
- Заплатіть gas і дочекайтеся підтвердження. Щойно транзакція потрапила в мережу, те схвалення мертве.
Розрізняйте два типи схвалень і спосіб відкликання кожного. Схвалення ERC-20 (USDT, USDC і подібні) — це сума, тож відкликання = поставити суму в 0, хоча можна й не до нуля, а до невеликої достатньої суми. ERC-721 / ERC-1155 (NFT) зазвичай використовують setApprovalForAll — це перемикач: або все ввімкнено, або все вимкнено, без «зменшити суму». Відкликання = повернути це булеве значення в false.
Якось я зробив повну чистку на основній адресі, якою користувався понад три роки (цифри нижче — для ілюстрації). По чотирьох мережах знайшлося понад 40 схвалень, більше половини безлімітних, найстаріше — від протоколу, який я використав один раз два роки тому й більше не чіпав. Відкликання по одному вийшло приблизно в десяток із гаком доларів gas, розбив на два вечори, коли мережа була вільна.
Чим особливі Permit і Permit2
Описаний вище approve — це ончейн-схвалення: воно саме по собі транзакція, лишається в історії, тому його можна знайти. А популярні останніми роками Permit (EIP-2612) і Permit2 від Uniswap — це схвалення, підписані офчейн, і це ускладнює перевірку.
Permit задумувався заради економії gas: замість окремої транзакції approve ви офчейн підписуєте повідомлення-схвалення й надсилаєте цей підпис разом із самою дією, зливаючи схвалення й використання в один крок. Мінус у тому, що цей підпис не обов’язково лишає окремий ончейн-запис approve, і в історії транзакцій ви можете взагалі не побачити, що саме схвалили. Шахраї експлуатують рівно це, маскуючи шкідливе схвалення під один нешкідливий підпис.
Permit2 — єдиний контракт схвалень від Uniswap. Логіка така: ви робите один ончейн-approve (часто безлімітний) на єдиний контракт Permit2, і далі всі застосунки, що використовують Permit2, запитують у нього allowance офчейн-підписом, а Permit2 рухає ваші токени замість них. Це збирає керування схваленнями в одному місці, але й означає, що сам контракт Permit2 тримає великі права над вашими токенами.
Як перевіряти Permit2:
- Спершу погляньте, які ERC-20 approve ви видали на адресу контракту Permit2 — це ончейн-записи, їх видно в експлорері чи revoke.cash.
- Потім перевірте allowance, які Permit2 видав усередині себе: інструменти на кшталт revoke.cash уже читають внутрішні зв’язки схвалень Permit2 й показують, яким застосункам він передав права, на яку суму й коли вони спливають.
- У під-схвалень Permit2 може бути термін спливання, але багато дефолтів досі ставляться дуже довгими. Періодично заходьте й прибирайте під-схвалення, якими більше не користуєтеся, разом із надто довгими термінами.
Оскільки все йде через офчейн-підпис, у попапі Permit / Permit2 зазвичай видно структурований підпис, а не «транзакцію переказу», і це збиває з пантелику сильніше. Заведіть звичку: якщо в підписі зринають слова на кшталт Permit, spender, allowance — зупиніться й прочитайте адресу spender і суму; не сходиться з очікуванням — відхиляйте. Як змусити гаманець показувати ці поля людською мовою — у розділі про розбір підпису в Налаштуваннях безпеки MetaMask.
Найкращі практики · тримати експозицію мінімальною
Перевірка та відкликання — це лікування постфактум; по-справжньому спокійніше, коли ви від початку не розмазуєте експозицію так широко. Кілька правил, яких я завжди тримаюся:
- Відкликав, щойно закінчив. Спробував новий протокол чи зробив разовий mint — відклич схвалення, щойно закінчив: двері зачиняються рівно в мить завершення угоди.
- Не давай безліміт. Якщо попап approve дозволяє міняти суму, давай лише те, що потрібно цій транзакції. Більшість великих гаманців і dApp нині підтримують свою суму.
- Аудит регулярно. Задай собі ритм — наприклад, раз на квартал проганяти мережі через revoke.cash і чистити безлімітні, давно не використані й невпізнавані.
- Великі кошти — на окремий гаманець, який ніколи не під’єднується до dApp. Це найдієвіша фізична ізоляція: основні активи на адресі, яка ні до чого не під’єднується, а для щоденної активності — інша «передова» адреса з невеликим балансом; передову розведуть — основний запас цілий. Про шарування за адресами — у повному гайді по гаманцях.
- Читай перед підписом. Останній рубіж будь-якого захисту — ті три секунди перед підписом; зрозуміти spender і суму важливіше за будь-який інструмент.
Вартість і кілька поширених міфів
Є кілька оман про відкликання, які варто прояснити, щоб ви не панікували й не розслаблялися з хибних причин.
Міф перший: відкликання безплатне. Ні — це ончейн-транзакція, і ви платите gas. Тому відкликати кожне схвалення з історії нема навіщо. У пріоритеті безлімітні, непотрібні й незрозумілого походження; невелика allowance довіреному протоколу, яким ви часто користуєтеся, може лишитися — заощадите gas на повторних апрувах.
Міф другий: є схвалення = вже обікрали. Ні. Схвалення лише означає, що spender міг би рухати ваші токени, але не що їх уже рухнули. Знайшлася купа безлімітних схвалень — не лякайте себе одразу: сортуйте за ризиком і відкликайте з найнебезпечніших. Біда стається лише за умови, що той контракт шкідливий або зламаний.
Міф третій: відкликав — і назавжди. Ні. Відкликання діє лише на це одне схвалення — наступного разу той самий протокол знову попросить апрув, і це нормально; просто дайте достатню суму за потребою. Відкликання — це не «бан», а «забрати цей один ключ».
Міф четвертий: змінив застосунок-гаманець — старі схвалення зникли. Ні. Схвалення прив’язане до адреси, а не до того застосунку, яким ви її відкриваєте. Поки на старій адресі ще є токени, ті схвалення лишаються чинними й лишаються ризиком — треба під’єднатися й відкликати. Якщо стара адреса повністю порожня й не використовується, можна лишити, але безпечніше вивести її з обігу й більше ніколи не надсилати туди жодних активів.
Що підводить до кута, який не обійти: уся ця морока з перевіркою, відкликанням та аудитом — це, по суті, ціна самостійного зберігання: ви самі керуєте ключами, отже, самі керуєте схваленнями. Якщо частина активів лежить просто на довгий строк, без планів на часті ончейн-взаємодії, то на централізованій біржі на кшталт Binance питання схвалень просто не виникає: платформа зберігає за вас, і ви не втрачаєте кошти через одне хибне схвалення (натомість — треба довіряти самій платформі). У самостійного зберігання й кастодіального — свої компроміси, і ділити кошти за призначенням — реалістичніший шлях; про це ми теж докладно говоримо в холодний гаманець vs гарячий гаманець.
Наостанок
Схвалення токенів — це водопровідні труби під DeFi: користуєшся з розумом — усе працює гладко, проґавиш — і це незамкнені двері на вашому гаманці. Гайд зводиться до трьох речей: розуміти, що таке схвалення, регулярно перевіряти, що ви видали, і відкликати зайве й небезпечне. Плюс одна звичка, що проходить крізь усе, — читати, що саме ви схвалюєте, перед підписом.
Приділіть десять хвилин сьогодні й проженіть свою щоденну адресу через revoke.cash. З великою ймовірністю зрине пара безлімітних схвалень, про які ви давно забули, — відкличте їх, і, можливо, ви щойно перекрили майбутню втрату, про яку ніколи б і не дізналися.
Інтерфейси та інструменти змінюються швидко. Якщо щось у цьому гайді не сходиться з тим, що ви бачите, — напишіть нам, ми фіксуємо це на сторінці виправлень. Біди зі схваленнями зазвичай ідуть разом з оманливим підписом, тож раджу прочитати Налаштування безпеки MetaMask разом із цим: там — «як прочитати перед підписом», а тут — «як забрати назад після»; два захисти, один до й один після.