Краткий ответ
Большинство одобрений 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.