Коротка відповідь

Більшість дозволів ERC-20 і ERC-721 самі не спливають. Видавши дозвіл, ви лишаєте його чинним, доки явно не відкличете. Винятки: підписи Permit (EIP-2612) містять параметр deadline — такий підпис стає недійсним у вказаний момент. Підписи Permit2 теж мають термін дії. А от класичні виклики setApprovalForAll та approve для ERC-20 терміну дії не мають: дозвіл, виданий у 2021 році, чинний і сьогодні.

Три типи дозволів

ERC-20 approve. Стандартний «необмежений дозвіл», який до 2023 року вимагала більшість DEX. Терміну дії немає, дозвіл діє роками. Відкликати його можна лише окремою транзакцією.

ERC-721 setApprovalForAll. Його використовують NFT-маркетплейси (OpenSea, LooksRare). Це простий перемикач: true — дозвіл надано, false — відкликано. Терміну дії немає: дозвіл діє, доки ви вручну його не вимкнете.

EIP-2612 Permit / Permit2. Підпис поза блокчейном із вбудованим терміном дії. Підписали з терміном на годину — через годину він недійсний. З терміном на рік — діє рік. З датою 2099 — фактично безстроковий.

Чому це важливо

Дозвіл, який ви у 2021 році видали DEX, яким уже не користуєтеся, досі активний. Якщо контракт цього DEX згодом зламають (Multichain 2023, Curve 2023 тощо), зловмисник зможе скористатися вашим старим дозволом і вивести цей токен із гаманця — через три роки після того, як ви про дозвіл забули.

Саме тому варто щокварталу перевіряти дозволи на revoke.cash. Чим довше дозволи висять, тим більше у вас вразливих місць.

Що справді спливає само

Сучасні реалізації Permit і Permit2 зазвичай ставлять короткий термін дії — від години до 30 днів. Інтерфейс Uniswap V3, наприклад, за замовчуванням пропонує підписати Permit2 на 30 днів. Після цього саме цей підпис використати вже не вийде.

Але це стосується конкретного підпису, а не токена. Новий підпис Permit2 для того самого токена спрацює як звичайно: те, що старий прострочений, не заважає видавати нові.

Поширена помилка

Багато хто вважає, що дозвіл «зникає, коли я відключаю гаманець» або «коли закриваю dApp». Ні те, ні інше не правда. Стан підключення зберігається в інтерфейсі гаманця, а дозволи записані в блокчейні. Відключилися, підключилися знову, закрили сайт — дозволу в блокчейні це ніяк не стосується.

Єдине безпечне припущення

Вважайте кожен дозвіл безстроковим, доки не відкличете його. Перевіряйте revoke.cash щокварталу. Відкликайте дозволи для контрактів, якими більше не користуєтеся. Насамперед — «необмежені» дозволи: це найризикованіша категорія.

Для адрес, де ви зберігаєте кошти надовго і які не повинні видавати жодних дозволів: тримайте їх на апаратному гаманці й ніколи не підключайте до dApp. Якщо ви не підписуєте дозволів, то й атакувати через них нічого.

Що почитати далі: revoke.cash, EIP-2612 Permit.