| Слой | Кому дано право | Что читать |
|---|---|---|
| ERC-20 approval | Контракту Permit2 | allowance(owner, Permit2) в контракте токена |
| AllowanceTransfer | Конкретному spender через Permit2 | amount, expiration и nonce для owner-token-spender |
| SignatureTransfer | Spender, включённому в подписанный EIP-712 hash | token/max amount, deadline, optional witness, unsigned transferDetails, nonce bitmap и receipt |
- Слой
- ERC-20 approval
- Кому дано право
- Контракту Permit2
- Что читать
- allowance(owner, Permit2) в контракте токена
- Слой
- AllowanceTransfer
- Кому дано право
- Конкретному spender через Permit2
- Что читать
- amount, expiration и nonce для owner-token-spender
- Слой
- SignatureTransfer
- Кому дано право
- Spender, включённому в подписанный EIP-712 hash
- Что читать
- token/max amount, deadline, optional witness, unsigned transferDetails, nonce bitmap и receipt
Одинаковое название скрывает два разных разрешения
`AllowanceTransfer` хранит многоразовое разрешение по тройке владелец, токен и spender. Подпись может обновить сумму и срок, а последовательный nonce защищает обновление. После этого spender вызывает Permit2 без новой подписи владельца, пока сумма и срок позволяют.
`SignatureTransfer` не создаёт такое хранимое разрешение. Владелец подписывает token permissions, одноразовый nonce и deadline; вариант с witness связывает подпись с дополнительными данными. Но оба режима всё равно опираются на ERC-20 approval, выданный токеном контракту Permit2.
Снимок должен связать сеть, контракт и четыре стороны
Проверка без подписи
- 1Зафиксировать идентичность
Запишите chain ID, owner, полный адрес токена, адрес Permit2 и предполагаемый spender. Сверьте Permit2 с официальным deployment registry этой сети и убедитесь, что по адресу есть ожидаемый контрактный код. Не переносите вывод между сетями.
- 2Прочитать approval токена
Вызовите ERC-20 allowance для owner и указанного Permit2. Ноль закрывает канал этого токена через этот Permit2; другие ERC-20 allowances не меняются. Ненулевое значение ещё не доказывает право конкретного spender.
- 3Прочитать AllowanceTransfer
Для точной тройки сохраните amount, expiration и nonce. Сравните expiration со временем блока, а не с часами браузера.
- 4Проверить одноразовый nonce
Разложите nonce SignatureTransfer на word position и бит, затем прочитайте nonceBitmap владельца. Установленный бит означает расход или явную инвалидацию.
- 5Сверить подпись
Проверьте EIP-712 domain, token, maximum amount, spender, deadline и optional witness. Spender связывается с вызывающим Permit2 адресом msg.sender; to и requestedAmount обычная подпись не защищает. Не подписывайте повторно ради диагностики.
Установленный бит nonce доказывает только то, что эту подпись больше нельзя использовать. Причину определяют отдельно: событие UnorderedNonceInvalidation подтверждает явную инвалидацию, а расход — успешный внешний или внутренний вызов Permit2 с тем же nonce, совпавшими подписанными данными и transferDetails, плюс Transfer event нужного token contract и согласованный эффект баланса. Если найден только bitmap, честный вывод — «повтор невозможен», а не «токены уже списаны».
Общий отзыв ERC-20 разрешений объясняет базовый слой, а разбор typed data помогает увидеть точные поля подписи. Здесь итогом должен быть отдельный снимок Permit2.
Отзыв выбирают по оставшемуся каналу
| Наблюдение | Действие | Проверка |
|---|---|---|
| AllowanceTransfer amount больше нуля и срок ещё действует | Сделать lockdown или установить нулевую сумму для точной тройки | После lockdown/approve(0): успешный receipt и amount=0; ожидание срока проверяют отдельно по block.timestamp > expiration |
| Неиспользованная SignatureTransfer подпись раскрыта | Инвалидировать соответствующий бит nonce | nonceBitmap содержит этот бит |
| Нужен полный запрет Permit2 для токена | Установить ERC-20 allowance(owner, Permit2)=0 | Контракт токена возвращает ноль |
| Транзакция расхода уже включена | Не повторять отзыв как замену расследованию | Receipt, Transfer events и новые балансы согласованы |
- Наблюдение
- AllowanceTransfer amount больше нуля и срок ещё действует
- Действие
- Сделать lockdown или установить нулевую сумму для точной тройки
- Проверка
- После lockdown/approve(0): успешный receipt и amount=0; ожидание срока проверяют отдельно по block.timestamp > expiration
- Наблюдение
- Неиспользованная SignatureTransfer подпись раскрыта
- Действие
- Инвалидировать соответствующий бит nonce
- Проверка
- nonceBitmap содержит этот бит
- Наблюдение
- Нужен полный запрет Permit2 для токена
- Действие
- Установить ERC-20 allowance(owner, Permit2)=0
- Проверка
- Контракт токена возвращает ноль
- Наблюдение
- Транзакция расхода уже включена
- Действие
- Не повторять отзыв как замену расследованию
- Проверка
- Receipt, Transfer events и новые балансы согласованы
После отзыва перечитайте состояние на подтверждённом блоке и сохраните хеш транзакции. Если интерфейс показывает ноль, а прямой вызов контракта — прежнюю сумму, остановитесь и проверьте сеть, адрес Permit2 и block tag.
Стоп-сигналы
- сеть, токен, Permit2 или spender взяты из интерфейса без сверки полного адреса;
- установленный бит nonce называют доказанным списанием без receipt и Transfer event;
- нулевой AllowanceTransfer принимают за отзыв ERC-20 approval токена;
- router принимает действительную Permit2-подпись без привязки к ожидаемому caller/owner или позволяет подменить to;
- сайт просит новую подпись или подключение кошелька только ради проверки состояния.
Белый список адресов вывода и ограничения API-ключей защищают другие каналы. Они не отменяют Permit2, но помогают составить полный инвентарь машинных и контрактных прав.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Uniswap Permit2 — architecture Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
- Permit2 — IAllowanceTransfer Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
- Permit2 — ISignatureTransfer Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
- Permit2 — SignatureTransfer implementation Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
- Permit2 — PermitHash Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
- Uniswap Developers — Signature Transfer Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
- Uniswap Developers — Deployments Uniswap · Проверено 30 августа 2026 г. в 15:55 GMT+5
