| Поле | Что должно быть установлено | Почему это важно |
|---|---|---|
| Source account | Точный адрес существующего token account | Закрывается account, а не wallet и не mint |
| Program owner | Token Program либо Token-2022 | Instruction должна уйти в программу, которая владеет данными |
| Authority | Owner или текущий close authority | Другой signer не получает право закрытия |
| Destination | Проверенный writable account | Именно туда перейдут lamports source account |
- Поле
- Source account
- Что должно быть установлено
- Точный адрес существующего token account
- Почему это важно
- Закрывается account, а не wallet и не mint
- Поле
- Program owner
- Что должно быть установлено
- Token Program либо Token-2022
- Почему это важно
- Instruction должна уйти в программу, которая владеет данными
- Поле
- Authority
- Что должно быть установлено
- Owner или текущий close authority
- Почему это важно
- Другой signer не получает право закрытия
- Поле
- Destination
- Что должно быть установлено
- Проверенный writable account
- Почему это важно
- Именно туда перейдут lamports source account
Сначала доказать, какой account вы закрываете
Основной wallet address и Token Account — разные объекты. Token account хранит mint, owner, raw amount, состояние native/frozen и optional close authority; его program owner указывает, кто интерпретирует эти данные. Associated Token Account (ATA) — стандартный адрес такого счёта, но у одного owner могут быть и другие accounts того же mint. Поэтому список для уборки получают on-chain по owner и обеим token programs, а не из скрытых карточек одного приложения.
Обычный account, frozen и wrapped SOL закрываются не одинаково
| Наблюдение | Можно готовить CloseAccount? | Следующая проверка |
|---|---|---|
| Обычный token amount равен нулю | Да, при верных authority/program | Destination и точные instruction accounts |
| Frozen, но token amount равен нулю | Да: freeze сам по себе не запрещает close | Owner/close authority и program |
| Обычный token amount больше нуля | Нет | Не сжигать и не переводить без проверки mint и получателя |
| Wrapped SOL account | Отдельная ветка: допускается ненулевой token amount | Underlying lamports и ожидаемое разворачивание SOL |
| Token-2022 с extensions | Только после extension-aware проверки | Дополнительные close checks текущей версии программы |
- Наблюдение
- Обычный token amount равен нулю
- Можно готовить CloseAccount?
- Да, при верных authority/program
- Следующая проверка
- Destination и точные instruction accounts
- Наблюдение
- Frozen, но token amount равен нулю
- Можно готовить CloseAccount?
- Да: freeze сам по себе не запрещает close
- Следующая проверка
- Owner/close authority и program
- Наблюдение
- Обычный token amount больше нуля
- Можно готовить CloseAccount?
- Нет
- Следующая проверка
- Не сжигать и не переводить без проверки mint и получателя
- Наблюдение
- Wrapped SOL account
- Можно готовить CloseAccount?
- Отдельная ветка: допускается ненулевой token amount
- Следующая проверка
- Underlying lamports и ожидаемое разворачивание SOL
- Наблюдение
- Token-2022 с extensions
- Можно готовить CloseAccount?
- Только после extension-aware проверки
- Следующая проверка
- Дополнительные close checks текущей версии программы
Wrapped SOL (WSOL) — native-mint token account, где lamports отражаются как token amount после синхронизации. Официальный CloseAccount делает для него исключение: счёт можно закрыть с ненулевым token amount, чтобы вернуть underlying SOL в destination. Это не правило для любого SPL-токена. В transaction preview проверьте source, native state, destination и полную транзакцию Solana; не подменяйте unwrap переводом незнакомого токена.
Token-2022 сохраняет базовую схему CloseAccount, но отдельные extensions добавляют проверки. Сначала декодируйте account через правильный program ID и перечислите расширения, затем сверяйте их с текущей документацией и кодом программы. Полномочия токена Solana на mint-level и close authority одного token account — разные поверхности: закрытие пустого account не отзывает freeze, mint или permanent-delegate права выпуска.
Соберите закрытие как проверяемую операцию
Перед подписью
- 1Закрепите cluster и slot
Сохраните genesis/cluster, commitment и slot чтения; одинаковый адрес в другой сети означает другой state.
- 2Декодируйте source
Запишите program owner, mint, token owner, raw amount, native/frozen state, close authority и extensions.
- 3Определите signer
Если close authority задан, используйте его; иначе право подтверждает owner. Для multisig сохраните точный набор signer accounts.
- 4Проверьте destination
Сопоставьте адрес с контролируемым получателем. CloseAccount не обязан возвращать lamports fee payer или token owner.
- 5Симулируйте exact instruction
Проверьте program ID, source, destination, authority и дополнительные instructions; не подписывайте пакет с несвязанным transfer/approve.
- 6Зафиксируйте до и после
Сохраните source lamports, destination lamports, fee payer, signature и ожидаемый post-state.
Удаление подтверждают двумя изменениями состояния
После подтверждения signature перечитайте source и destination на том же commitment. Успешный результат: source account больше не возвращается RPC, а destination получил ровно его прежние lamports с учётом других изменений этой транзакции. Позднее ATA можно создать заново; это новый account lifecycle, а не восстановление старых данных. Если signature failed, никакого возврата не предполагают — разбирают error и текущий state заново.
Stop-сигналы и восстановление
- amount взят из округлённого интерфейса, а raw state не сохранён;
- program ID не совпадает с owner source account либо Token-2022 extensions не декодированы;
- destination предложен сайтом или ботом и не принадлежит ожидаемому получателю;
- close authority неизвестен, но предлагают передать seed или заменить authority отдельной скрытой инструкцией;
- пакет одновременно создаёт delegate, переводит токены или меняет mint-level authority;
- обещают одинаковый rent refund для любого account без чтения его lamports.
Если обнаружен неизвестный delegate, сначала определите, кто и сколько ещё вправе списать: сам CloseAccount не является revoke и не возвращает уже выведенные активы. При скомпрометированном owner остановите массовую уборку, сохраните транзакции и перенесите ценные balances по заранее проверенному плану. Для обычной ошибки обновите blockhash/state, исправьте только доказанную причину и заново покажите пользователю source, destination и authority.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Solana Docs — Close Token Account Solana Foundation · Проверено 23 августа 2026 г. в 15:39 GMT+5
- Solana Docs — Set Authority Solana Foundation · Проверено 23 августа 2026 г. в 15:39 GMT+5
- Solana Docs — Accounts Solana Foundation · Проверено 23 августа 2026 г. в 15:39 GMT+5
- Solana Docs — Sync Native Solana Foundation · Проверено 23 августа 2026 г. в 15:39 GMT+5
