Краткий ответ

Большинство одобрений ERC-20 и ERC-721 сами не истекают: выданное однажды действует, пока вы явно его не отзовёте. Исключение — подписи Permit (EIP-2612): в них есть параметр deadline, и подпись перестаёт действовать в указанный момент. Срок действия есть и у подписей Permit2. А вот у классических вызовов setApprovalForAll и approve для ERC-20 срока нет: одобрение, выданное в 2021 году, действует и сегодня.

Три вида одобрений

approve в ERC-20. То самое «безлимитное одобрение», которое до 2023 года запрашивало большинство DEX. Срока нет, одобрение живёт годами, и отменить его можно только отдельной транзакцией отзыва.

setApprovalForAll в ERC-721. Им пользуются NFT-маркетплейсы (OpenSea, LooksRare). Это флаг: true — доступ выдан, false — отозван. Срока нет: доступ сохраняется бессрочно, пока вы сами не переключите флаг.

Permit (EIP-2612) и Permit2. Подпись вне блокчейна со встроенным сроком действия. Подписали в 2024 году со сроком в час — через час она недействительна. Со сроком в год — через год. Со сроком «до 2099 года» — фактически никогда.

Почему это важно

Одобрение, выданное в 2021 году децентрализованной бирже, которой вы давно не пользуетесь, по-прежнему действует. Если её контракт потом взломают (как Multichain или Curve в 2023 году), злоумышленник через ваше старое одобрение выведет этот токен из кошелька — спустя три года после того, как вы о нём забыли.

Именно поэтому стоит завести привычку раз в квартал заходить на revoke.cash. Чем дольше висят старые одобрения, тем больше у атакующего возможностей.

Что истекает само

Современные реализации Permit и Permit2 обычно ставят короткий срок — от часа до 30 дней. Интерфейс Uniswap V3, например, по умолчанию запрашивает подпись Permit2 на 30 дней. Через 30 дней именно эту подпись использовать уже нельзя.

Но срок относится к конкретной подписи, а не к токену. Новая подпись Permit2 для того же токена сработает как обычно: истёкшая старая никак не мешает выдавать новые.

Распространённое заблуждение

Многие уверены, что одобрения «пропадают, когда отключаешь кошелёк» или «когда закрываешь dApp». Это не так. Подключение — это состояние в интерфейсе кошелька, а одобрения записаны в блокчейне. Отключились, подключились заново, закрыли, открыли — одобрение в блокчейне остаётся как было.

Единственное надёжное допущение

Считайте любое одобрение бессрочным, пока сами его не отзовёте. Раз в квартал проверяйте кошелёк на revoke.cash и отзывайте одобрения контрактам, которыми больше не пользуетесь. В первую очередь — безлимитные: это самая опасная категория.

Адреса для долгого хранения, с которых одобрения не должны выдаваться вовсе, держите на аппаратном кошельке и никогда не подключайте ни к одному dApp. Если вы не подписываете одобрений, через них ничего и не украдут.

Дополнительное чтение: revoke.cash, EIP-2612 Permit.