Guides

ERC-20 approve: почему новый лимит не отменяет уже списанное

17 октября 2026 г.
6 мин чтения

Как различать остаток разрешения и прошлые списания. Перебор порядка изменений approve и попыток transferFrom в ограниченной учебной модели.

Исходный лимит 100. В порядке S1 U1 U2 S2 сначала списываются 100, затем лимит обнуляется и устанавливается в 50, затем списываются ещё 50. Итог успешных списаний 150, текущий лимит 0.
Один из шести допустимых порядков двух заранее заданных очередей. Новое разрешение не является отменой прошлого списания. Открыть схему крупнее

В кошельке был разрешён лимит 100 единиц токена, а пользователь решил оставить только 50. После изменения он видит новое число и ожидает, что суммарно больше 50 списать уже нельзя. Но allowance описывает оставшееся разрешение в текущем состоянии. Оно не является общим пределом всех переводов, выполненных до и после изменения.

Что меняется при approve

Стандарт ERC-20 описывает approve как установку нового значения разрешения для spender. Повторный вызов заменяет текущее allowance. Это не прибавление к старому значению и не возврат ранее переведённых токенов. Владелец, контракт токена и получатель разрешения определяют конкретную связь, которую нужно проверять.

Баланс
Сколько токенов находится у владельца в рассматриваемом состоянии.
Allowance
Сколько ещё разрешено списать определённому spender.
Уже выполненное списание
Отдельный результат прошлого действия. Новый лимит сам по себе его не отменяет.

Перевод владельцем через transfer и использование разрешения через transferFrom — разные операции. Поэтому сначала выясните, что именно просит подтвердить интерфейс: перевод, разрешение конкретному контракту или другое действие. Наличие слова «обмен» не объясняет смысл запрашиваемой операции.

Учебный пример с двумя очередями

Пусть исходный конечный лимит равен 100 минимальным единицам. Владелец заранее выбрал два изменения: сначала 0, затем 50. Вторая сторона делает две попытки списания: сначала 100, затем 50. Внутренний порядок каждой очереди сохраняется, но между очередями возможны разные чередования.

Обозначим изменения владельца U1 и U2, попытки списания S1 и S2. В модели approve всегда заменяет лимит успешно. Списание проходит только при достаточном allowance и уменьшает его; при недостаточном разрешении попытка отмечается неуспешной и лимит не меняется. Баланс считается достаточным и отдельно не моделируется.

Шесть порядков для заранее выбранных изменений 0 → 50 и попыток 100 → 50
ПорядокУспешно списано, единицЛимит в концеЧто произошло
U1 U2 S1 S2500100 не проходит, затем проходят 50
U1 S1 U2 S2500Первая попытка встречает нулевой лимит
U1 S1 S2 U2050Обе попытки происходят до нового разрешения
S1 U1 U2 S21500100 списаны до обнуления, ещё 50 после нового разрешения
S1 U1 S2 U210050Вторая попытка встречает нулевой лимит
S1 S2 U1 U210050После первых 100 разрешение исчерпано

Почему обнуление не возвращает прежние средства

В ERC-20 есть рекомендация для интерфейсов сначала установить ноль перед изменением значения. Это не означает, что уже выполненный до обнуления перевод исчезнет. В четвёртой строке таблицы первые 100 списаны раньше U1. Последующее U2 создаёт заранее выбранное новое разрешение 50, поэтому итог успешных списаний в этой модели равен 150.

Проблема порядка операций при изменении allowance рассмотрена и в исследовании Resolving the Multiple Withdrawal Attack on ERC20 Tokens. Однако таблица — собственный ограниченный пример, а не воспроизведение реальной сети или доказательство поведения любого токена.

Что именно перебирает инструмент

Вводятся исходный лимит, до трёх новых значений владельца и до четырёх попыток списания. Все суммы — целые минимальные единицы одного токена, без перевода в пользовательские десятичные количества. Например, 100 здесь не обязательно означает 100 целых монет. Параметр decimals инструмент не узнаёт.

Он сохраняет порядок внутри каждой очереди и перебирает только их чередования. Для двух и двух действий получаются шесть вариантов, для трёх и четырёх — тридцать пять. Суммы считаются точно целыми числами. Минимум и максимум относятся только к перечисленным вариантам и принятым правилам, а не к возможным потерям реального кошелька.

Какие детали реального контракта остаются за рамками

  • Особое поведение максимального разрешения и нестандартных токенов.
  • Недостаточный баланс, комиссии, паузы, ограничения получателей и ошибки approve.
  • Подписи permit, временные разрешения, пакетные или атомарные операции.
  • Мемпул, комиссии за газ, приоритет транзакций, отмены и реорганизации.

Инструмент не читает блокчейн и не проверяет разрешения адреса. Для разбора собственного случая нужны сеть, точный контракт токена, spender и фактически подтверждённые операции. Не вводите сюда приватные ключи, seed-фразу или подписи: полей для них нет и для объяснения они не нужны.

На странице KOT.CASH «Как это работает» описан процесс с отправкой на депозитный адрес. Это не повод считать любое стороннее окно approve частью заявки. Сверьте действие с текущими инструкциями своего ордера; при непонятном запросе уточните его назначение до подтверждения. Этот материал объясняет смысл лимита, а не предлагает выдавать новое разрешение.

Сравнить порядки изменения разрешения

Целые минимальные единицы 0–10^30. Один токен, владелец и spender. Внутренний порядок очередей сохраняется. Approve всегда успешен и заменяет лимит, успешное списание уменьшает его. Баланс считается достаточным. Нет unlimited, permit, газа, сетевого прогноза, подключения кошелька и реальных операций. Расчёт выполняется на вашем устройстве, введённые данные никуда не отправляются.

Как это работаетПростой Обмен

Источники

Готовы обменять крипту?

Быстрые, прозрачные свопы — регистрация не нужна.

Начать обмен
ERC-20 approve: почему новый лимит не отменяет уже списанное | KOT.CASH