ЗНАНИЯ БЕЗ ЛИШНЕГО ШУМА

Permit в ERC-20. Что разрешает подпись и как проверить параметры

Как работает подпись EIP-2612, что проверять у spender, суммы, nonce и срока и когда разрешение начинает действовать.

Подписанная карточка разрешения и отдельный токен

Permit по EIP-2612 позволяет владельцу токенов подписать данные, по которым контракт затем установит разрешение на расходование. Подпись обычно создаётся без отдельной транзакции от владельца. Чтобы разрешение появилось в блокчейне, кто-то должен передать подпись в контракт и получить успешное выполнение. Поэтому отсутствие запроса на оплату газа в окне подписи ничего не говорит о размере разрешения.

Какие данные подписываются

В стандартной форме есть владелец, получатель разрешения, размер, порядковый номер и крайний срок. Получатель разрешения называется spender. Это адрес, которому разрешат расходовать токены через предусмотренный контрактом механизм. Он может принадлежать приложению или другому участнику. Сумма указывается в базовых единицах токена, поэтому сверяйте и количество, и его представление в понятных единицах.

Подписанные данные привязаны к домену EIP-712. Для типичной реализации он включает идентификатор сети и адрес проверяющего контракта. Проверьте, что данные относятся к нужному токену и сети, а spender совпадает с адресом, который вы ожидаете. Название сайта в браузере и тикер в окне кошелька не заменяют эту проверку. Если кошелёк не показывает понятных полей, из одной надписи «подпишите для продолжения» нельзя установить, какие права вы передаёте.

Пример с ограниченным разрешением

Условный токен имеет шесть десятичных знаков. Чтобы разрешить расходование 250 токенов, в поле value записывают 250 000 000 базовых единиц. Пусть текущий nonce владельца в этом контракте равен 4. Если вызов permit успешен и остальные условия соблюдены, allowance для выбранного spender становится равен 250 токенам, а nonce увеличивается до 5. Та же подпись со старым номером больше не подходит для повторного применения в этом контракте.

Если spender затем расходует 80 токенов через обычную реализацию, которая уменьшает конечное разрешение на величину перевода, остаток составит 170. Историю можно сверить по событию разрешения, текущему allowance и фактическому переводу. Подпись сама по себе не переводит эти 80 токенов. В одном вызове приложения установка разрешения и расходование могут происходить последовательно, поэтому при проверке полезно читать весь результат транзакции.

Что проверяет владелец. Spender — кто получает право. Value — сколько единиц. Deadline — срок подписи
Что проверяет владелец

Срок подписи и срок разрешения

Deadline ограничивает момент, до которого допустимо подать подпись в контракт. Если permit уже выполнился, истечение deadline само по себе обычно не обнуляет созданный allowance. Для действующего разрешения смотрите текущее значение у пары владелец и spender. Так можно отличить просроченную подпись, которую ещё не подавали, от уже предоставленного права расходовать.

Отдельная проверка нужна, когда подпись создана, но ещё может быть подана. Изменение allowance обычным approve само по себе не обязано изменить nonce permit. Ранее выданная подпись с действующим nonce и сроком в таком случае может быть использована позже. При разборе конкретного случая сверяйте поведение нужного контракта. Формы Permit2 и схемы отдельных токенов могут использовать другие правила. Одно слово permit в интерфейсе не определяет стандарт.

Состояние разрешения. Nonce до — 4. Nonce после — 5. Allowance — 250 токенов
Состояние разрешения

Как разобраться в записи кошелька

Сначала определите контракт, сеть и spender. Прочитайте сумму в базовых единицах токена и посмотрите deadline. Сопоставьте nonce подписи с данными контракта, если разбираете уже подписанный запрос. Затем проверьте историю на предмет применения permit и расходования. Текущий allowance отвечает на вопрос о действующем праве, а история переводов показывает, что уже списано. Для сравнения используйте разбор обычного approve.

Поиск по сайту