При работе с цифровыми активами важно различать владение и разрешённый доступ. Для токенов ERC-20 этим понятиям соответствуют ваш баланс и лимит расходов (allowance). Баланс показывает количество токенов, учтённых за вашим кошельком. Лимит расходов — это отдельное разрешение, которое вы предоставляете указанному адресу, позволяя ему переместить от вашего имени определённое количество этих токенов.
Смарт-контракты могут требовать разрешения на использование ваших активов, которое предоставляется с помощью подтверждения (approval). Выполнение транзакции подтверждения само по себе не переводит токены из вашего кошелька. Вместо этого оно изменяет контракт токена, устанавливая или меняя лимит расходов (allowance) и указывая адресу, которому вы дали разрешение, сколько токенов ему доступно. Подтверждение отличается от перевода: перевод непосредственно перемещает активы.
После установки лимита разрешения получатель может инициировать перемещение активов с помощью механизма transferFrom. Перед обработкой транзакции контракт токена проверяет соответствующий баланс и лимит разрешения. Запрашиваемая сумма не должна превышать ни доступный баланс кошелька, ни установленный лимит. Если любого из этих ограничений недостаточно, попытка перемещения завершится неудачей.
Каждое разрешение распространяется на конкретный контракт токена и конкретного получателя разрешения на списание (spender). Разрешение на расходование одного актива ERC-20 не предоставляет доступ к другим токенам, учтённым другими контрактами токенов в том же кошельке. Это не общее разрешение на управление всем портфелем. Разрешения также не распространяются на нативные монеты блокчейна.
Мониторинг баланса кошелька не показывает, каким получателям разрешено перемещать токены. Поскольку разрешение меняет данные о правах доступа, а не сразу баланс токенов, в кошельке может по-прежнему отображаться прежний баланс, даже если у получателя остаётся неиспользованное право переводить токены. Поэтому одного баланса недостаточно, чтобы определить права получателей на списание. Чтобы узнать лимиты разрешений, необходимо изучить данные соответствующего контракта токена.
Лимит разрешения можно изменить, отправив новое разрешение для соответствующего контракта токена и получателя разрешения на списание. Установка лимита в ноль не позволяет этому получателю использовать разрешение для последующих переводов токенов — с учётом особенностей работы контракта токена. Изменение лимита влияет на дальнейшие действия, но не отменяет переводы, которые получатель уже выполнил.
