В Solana делегат токен-счёта может переводить или сжигать разрешённую сумму, а close authority управляет закрытием счёта по правилам программы. Это разные полномочия. Отзыв делегата сам по себе не меняет право закрытия и не удаляет permanent delegate, заданного на уровне эмитированного токена.
Найдите конкретный токен-счёт, затем смотрите права
В описании токен-счёта указаны его связь с одним mint и владельцем, а также поля делегата, разрешённой суммы и необязательной close authority. У кошелька может быть несколько таких счетов. Проверять нужно адрес из конкретной операции, а не считать одну строку токена в интерфейсе полным перечнем всех связанных разрешений.
Термин owner также используется для программы, которой принадлежит аккаунт на базовом уровне Solana. Отличайте её от владельца токен-счёта, записанного внутри его данных. Правильная пометка Token Program подтверждает управляющую программу, но не доказывает, что человеческий контролёр и расходные полномочия соответствуют вашим намерениям. Для проверки нужны оба уровня.
| Роль или поле | Обычная область полномочий | Чего наличие роли не доказывает |
|---|---|---|
| Владелец токен-счёта | Управление токенами и разрешениями по правилам программы | Что прежний ключ пользователя сохранил контроль |
| Delegate и delegated amount | Перевод или сжигание в рамках разрешённой суммы | Владение всеми активами кошелька |
| Close authority | Закрытие при выполнении условий программы | Произвольное расходование ненулевого баланса обычного токена |
| Permanent delegate на mint | Полномочие расширения для счетов этого токена | Обычное разрешение, отзываемое владельцем счёта |
| Владелец-программа | Программа, управляющая данными аккаунта | Корректность получателя и настроек полномочий |
Обычный делегат получает ограниченную сумму
Документация Approve Delegate описывает разрешение другому адресу переводить или сжигать определённое количество токенов с выбранного счёта. На счёте хранится один текущий делегат и его лимит. Новое подтверждение заменяет эту пару, а не добавляет ещё один независимый слот разрешений. Поэтому старую и актуальную запись важно различать.
При чтении сырого значения учитывайте decimals mint. В вымышленном примере токен имеет два знака после запятой, поэтому 2 500 базовых единиц разрешения означают 25 отображаемых токенов. Если остаток равен 80, стандартный делегат не получает только этим разрешением право потратить все 80. Небольшой текущий баланс, напротив, ещё не доказывает, что оставшийся лимит безопасно игнорировать.
Разрешение не подтверждает, что расходование уже состоялось: отдельно смотрят успешные операции и текущее состояние. Адрес делегата может относиться к согласованной подписке или другому законному сценарию. Непонятное назначение требует проверки, но само по себе не доказывает кражу. Предоставление полномочия также не означает автоматическую передачу приватного ключа всего кошелька.
Право закрытия проверяйте отдельно
Согласно описанию закрытия токен-счёта, операция удаляет аккаунт и направляет его lamports выбранному получателю. Для обычного счёта некоренного токена баланс токенов сначала должен стать нулевым. Поэтому close authority нельзя описывать как неограниченное разрешение переводить токены. Область риска определяется типом счёта и условиями закрытия.
Существенное исключение — wrapped SOL. Такой токен-счёт может закрываться при ненулевом токен-балансе с высвобождением лежащего в нём SOL. Документация wrapped SOL объясняет связь токен-суммы с lamports. Действие, похожее на возврат остатка за хранение пустого аккаунта, нужно оценивать внимательнее, если фактически на счёте находится wrapped SOL.
Если отдельная close authority задана, нельзя считать, что владелец токенов всегда закроет счёт независимо от неё. В коде исходной Token Program выбирается указанная close authority, а при её отсутствии — владелец токен-счёта. Для другой версии программы и расширений проверяют их собственные правила, не перенося вывод механически.
Permanent delegate — не обычный лимит счёта
В Token Extension Program есть расширение PermanentDelegate на уровне mint. Оно позволяет соответствующему полномочию авторизовать переводы и сжигание со счетов этого токена. Владелец отдельного счёта не удаляет такое право отзывом своего обычного делегата. Поэтому отсутствие локального delegate ещё не означает завершённую проверку всех полномочий токена.
Это не означает, что permanent delegate есть у любого токена Solana. Наличие расширения также само по себе не говорит о недобросовестности эмитента: оно описывает техническую возможность управления, которую нужно учитывать. Не подписывайте предложенную сайтом операцию «удаления полномочий эмитента», если вы ими не управляете. Название кнопки не заменяет объяснение реального изменения.
Как проверить предложенное исправление
- Найдите точный токен-счёт, mint и управляющую токен-программу. Сохраните подписи связанных транзакций и актуальные поля полномочий.
- Определите проблемную роль: обычный делегат, close authority, владелец либо полномочие расширения mint. Не подменяйте одно название другим.
- Для ненужного расходного лимита используйте поддерживаемый отзыв в доверенном кошельке. Перед подписью проверьте затронутый счёт.
- При изменении владельца или права закрытия уточните, кто сейчас вправе его выполнить. Обещание универсального сброса может скрывать другую операцию.
- После успешного завершения снова прочитайте данные счёта. Другие токен-счета могут иметь отдельные настройки и разрешения.
- Если раскрыты сами ключи, рассматривайте более широкий компромисс доступа. Отзыв одного лимита не делает известный постороннему ключ снова секретным.
Описание Revoke Delegate говорит об очистке текущего делегата и обнулении разрешённой суммы. Это изменение будущих полномочий, а не отмена уже завершённых переводов. Отключённый сайт или удалённая браузерная сессия не доказывают, что отзыв в блокчейне состоялся. Подтверждение ищут в результате операции и текущем состоянии счёта.
Смена роли тоже отличается от отзыва расходования. Справочник Set Authority описывает отдельные типы полномочий. Не стоит выполнять общий совет «поставить всем None»: допустимость и последствия зависят от роли. Понятный предварительный просмотр должен называть счёт, изменяемое полномочие и того, кто будет управлять им после подписи.
Проверьте адрес возврата остатка
Запрос на возврат остатка за хранение должен показывать закрываемый счёт и получателя lamports. Тот, кто первоначально создал аккаунт, не становится получателем автоматически. Калькулятор rent-exempt помогает разобраться с контекстом хранения, но оценка суммы не удостоверяет ни саму операцию, ни правильность адреса назначения. Это отдельная проверка перед подписью.
Если затем используете обмен без регистрации, следуйте текущим инструкциям заявки после разрешения проблемы с кошельком. Обмен не исправляет полномочия токен-счёта. Порядок отправки средств описан в разделе как работает сервис; неизвестного делегата не нужно одобрять лишь потому, что страница называет это условием обычного перевода.
Частые вопросы
Что может делать делегат токена Solana?
Обычный делегат токен-счёта может переводить или сжигать сумму в пределах своего разрешения по правилам программы. Это право относится к выбранному счёту, а не автоматически ко всем активам кошелька.
Может close authority Solana забрать баланс токен-счёта?
Обычный счёт некоренного токена закрывается при нулевом токен-балансе, после чего его lamports уходят получателю. Для wrapped SOL есть важное исключение: закрытие возможно с токен-балансом и высвобождает лежащий в нём SOL.
Отзыв делегата токена Solana убирает permanent delegate?
Нет, permanent delegate является полномочием mint в Token Extension Program. Обычный отзыв на отдельном счёте владельца его не удаляет.
По теме на сайте
Источники
- solana.com/docs/tokens/basics/create-token-account
- solana.com/docs/tokens/basics/approve-delegate
- solana.com/docs/tokens/basics/close-account
- solana.com/docs/tokens/basics/sync-native
- github.com/solana-program/token/blob/program@v9.0.0/program/src/processor.rs
- solana.com/docs/tokens/extensions/permanent-delegate
- solana.com/docs/tokens/basics/revoke-delegate
- solana.com/docs/tokens/basics/set-authority