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

Большинство ERC-20 и ERC-721 approval не истекают автоматически. Однажды выданные, они persist до явного отзыва. Исключения: подписи Permit (EIP-2612) включают параметр deadline — эта подпись истекает в специфицированное время. Подписи Permit2 также имеют deadline. Но классический setApprovalForAll и ERC-20 approve calls не имеют истечения; approval с 2021 года всё ещё валиден сегодня.

Три типа approval

ERC-20 approve. Стандартный "approve unlimited", использованный большинством DEX-интеграций до 2023 года. Без истечения. Approval persist через годы. Отзываемый только через явную revoke-транзакцию.

ERC-721 setApprovalForAll. Используется NFT-маркетплейсами (OpenSea, LooksRare). Boolean — true grants, false revokes. Без истечения. Approval persist бессрочно до ручного toggle.

EIP-2612 Permit / Permit2. Off-chain подпись со встроенным deadline. Подписана в 2024 с deadline 1 час → истекает через 1 час. Подписана с deadline 1 год → истекает через 1 год. Подписана с deadline 2099 → эффективно никогда.

Почему это имеет значение

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

Это центральная причина для квартальной привычки revoke.cash. Чем дольше approval сидят, тем больше ваша exposed attack surface.

Что безопасно auto-expires

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

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

Ловушка заблуждения

Многие пользователи верят, что approval "истекают, когда я отключаю кошелёк" или "истекают, когда я закрываю dApp". Ни одно не верно. Connection state живёт в UI вашего кошелька; approval живут on-chain. Disconnect, reconnect, close, reopen — on-chain approval не затронут.

Единственное безопасное предположение

Обращайтесь с каждым approval как с постоянным до тех пор, пока не отзовёте. Запускайте revoke.cash ежеквартально. Отзывайте approval к контрактам, которые больше не используете. Особенно отзывайте "unlimited" approval — это самая высокорисковая категория.

Для долгосрочных storage адресов, которые никогда не должны выдавать approval: держите их на аппаратном кошельке, никогда не подключайте к любому dApp. Approval surface равна нулю, если никогда не подписываете approval.

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