Кнопка «одобрить» в NFT-приложении может предоставлять существенно более широкое право, чем кажется из краткого описания. В ERC-721 и ERC-1155 функция `setApprovalForAll` включает оператора, которому владелец разрешает управлять всеми токенами соответствующего контракта от его имени. Это удобно для маркетплейсов и игровых приложений, но доступ действует на коллекцию целиком, а не только на NFT, который вы собираетесь выставить.
Важно различать этот механизм и `approve`, который в ERC-721 обычно назначает оператора для конкретного `tokenId`. Базовые разрешения fungible-токенов разобраны в статье о безлимитном и точном approve, но правила NFT отличаются. Здесь рассмотрим смысл `approvalForAll`, проверку адреса оператора и действия после того, как доступ больше не нужен.
Как работает setApprovalForAll
Владелец NFT вызывает функцию `setApprovalForAll(operator, approved)`. Значение `true` добавляет указанный адрес оператора в список доверенных для владельца в рамках контракта коллекции. Значение `false` отключает это разрешение. Оператор получает возможность вызывать предусмотренные стандартом функции передачи для NFT владельца. Для ERC-721 эта авторизация относится к активам владельца в конкретном NFT-контракте.
У ERC-1155 концепция похожа: владелец разрешает оператору управлять набором своих токенов этого контракта. Поскольку контракт может содержать много token ID, широкое разрешение способно покрывать несколько типов предметов и количества. Само название коллекции не показывает масштаб прав. Надёжнее смотреть стандарт, адрес контракта, адрес оператора и фактический аргумент `approved` в транзакции.
Чем отличается разрешение для одного NFT
В ERC-721 метод `approve` обычно привязывает полномочие к одному token ID, а `setApprovalForAll` – к оператору и всей коллекции. Узкое разрешение соответствует принципу минимально необходимых прав, когда сервису достаточно управлять отдельным предметом. Но конкретный маркетплейс может использовать пакетную операцию или ожидать операторское разрешение для будущих листингов. Не соглашайтесь на широкое право автоматически, если интерфейс не объясняет, зачем оно нужно.
Для ERC-1155 стандарт тоже предусматривает операторское одобрение всего набора, поэтому там нельзя делать вывод о масштабе доступа по одному выбранному предмету в интерфейсе. Проверьте коллекцию и адрес контракта, а затем прочитайте условия приложения. Если вы хотите выставить одну вещь, спросите, можно ли ограничиться другим механизмом. Смысл и последствия вызова должны совпадать с действием, которое вы собираетесь выполнить.
Почему широкое право опасно
Одобренный оператор может перемещать NFT владельца в пределах прав, предусмотренных стандартом и контрактом. Если вы ошиблись адресом, подтвердили фишинговый запрос или сервисный ключ оператора был скомпрометирован, пострадать могут разные токены той же коллекции. Одобрение не переводит NFT в момент подписи, но оставляет активное полномочие для последующего вызова.
Успешная симуляция не подтверждает добросовестность оператора и не гарантирует, что полномочие не будет использовано позже. Перед подтверждением изучите домен приложения, контракт коллекции, оператора и параметры транзакции. Если кошелёк показывает действие не так, как ожидается, разберите его через проверку симуляции и не полагайтесь только на название кнопки.
Как проверить активное разрешение
Стандарт ERC-721 предоставляет чтение `isApprovedForAll(owner, operator)`, которое возвращает булево значение для конкретного контракта, владельца и оператора. Проверьте адрес NFT-контракта и сеть, затем сравните владельца с адресом кошелька. В обозревателе также можно найти событие `ApprovalForAll`, где зафиксированы владелец, оператор и новое состояние разрешения.
Для ERC-1155 аналогичная проверка тоже относится к паре владелец-оператор в конкретном контракте. Не переносите результат одного NFT-контракта на другие коллекции: разрешения изолированы по адресу контракта. Список известных маркетплейсов или логотип в кошельке не подтверждает, что адрес оператора настоящий. Сверяйте его с официальной документацией сервиса, а не со случайной подписью транзакции.
Как отозвать ненужный доступ
Чтобы выключить операторское разрешение, владелец отправляет вызов `setApprovalForAll` с тем же адресом оператора и значением `false`. После подтверждения транзакции перечитайте состояние `isApprovedForAll` в той же сети. Дождитесь достаточной финальности для этой сети и не принимайте запись в интерфейсе за окончательное доказательство до появления изменения в блокчейне.
Отзыв препятствует будущему использованию этого разрешения, но не возвращает уже переведённый NFT и не отменяет другие полномочия, выданные тому же сервису. Для fungible-токенов и других контрактов могут действовать отдельные approvals. Практические шаги для проверки и отзыва таких разрешений разобраны в материале об отзыве разрешений токенов.
Чек-лист перед одобрением
Проверьте сеть, адрес коллекции, token standard, владельца и полный адрес оператора. Убедитесь, что действие ожидаемое, а `approved` действительно означает включение или выключение права. Посмотрите, просит ли приложение доступ ко всей коллекции или только к одному NFT. Сравните адрес оператора с официальной документацией и оцените, нужен ли этот доступ после завершения действия.
Широкий approvalForAll не всегда вредоносен: он может быть частью обычного процесса листинга или игры. Но это полноценное полномочие, а не безобидная техническая формальность. Оставляйте активными только те разрешения, которые понимаете и намерены использовать, и периодически сверяйте состояние одобрений для важных коллекций.



