Token Account — отдельный onchain-account, где хранятся mint, owner, amount, delegate, state и delegatedAmount. Associated Token Account (ATA) — лишь детерминированный адрес распространённого Token Account; у одного владельца могут быть и другие accounts того же mint. Поэтому проверка одного ATA не доказывает отсутствие разрешений на остальных. Сначала зафиксируйте cluster, Token Program ID, mint и точный account address.
| Состояние | delegate | delegatedAmount | Практический смысл |
|---|---|---|---|
| До approve | None | 0 | Только owner/другая допустимая authority распоряжается account |
| После Approve/ApproveChecked | Выбранный address | Лимит в raw units | Delegate может transfer или burn до лимита |
| После частичного расхода | Тот же address | Меньший остаток | Право сохраняется только на оставшуюся сумму |
| После Revoke | None | 0 | Прежний account delegate больше не распоряжается этим account |
- Состояние
- До approve
- delegate
- None
- delegatedAmount
- 0
- Практический смысл
- Только owner/другая допустимая authority распоряжается account
- Состояние
- После Approve/ApproveChecked
- delegate
- Выбранный address
- delegatedAmount
- Лимит в raw units
- Практический смысл
- Delegate может transfer или burn до лимита
- Состояние
- После частичного расхода
- delegate
- Тот же address
- delegatedAmount
- Меньший остаток
- Практический смысл
- Право сохраняется только на оставшуюся сумму
- Состояние
- После Revoke
- delegate
- None
- delegatedAmount
- 0
- Практический смысл
- Прежний account delegate больше не распоряжается этим account
Approve записывает право, а не резервирует и не переводит баланс
`Approve` получает source Token Account, delegate и amount; `ApproveChecked` дополнительно получает mint и decimals и проверяет ожидаемую точность. В обоих случаях owner подписывает установку разрешения. В account одновременно помещается одна пара delegate/allowance: повторный approve, даже другому адресу или на другую сумму, заменяет прежние значения. Amount — raw units, поэтому UI-число надо пересчитать через decimals mint.
Проверка связывает состояние account с конкретной инструкцией
- 1Найти все accounts
Получите Token Accounts владельца по обеим программам — original Token Program и Token-2022 — и не ограничивайтесь видимым ATA.
- 2Снять state
Для каждого account сохраните mint, owner, amount, state, delegate и delegatedAmount вместе со slot/commitment.
- 3Найти происхождение
Если delegate установлен, найдите последнюю успешную Approve или ApproveChecked именно для этого source account и разберите signer, delegate, amount.
- 4Проверить расход
Сопоставьте последующие transfer/burn, подписанные delegate, с уменьшением остатка; не выводите лимит из текущего token balance.
- 5Подтвердить revoke
После успешной Revoke transaction перечитайте account на новом slot: delegate должен быть None, delegatedAmount — zero.
Подпись и отправка — разные этапы: recent blockhash может истечь, transaction может завершиться ошибкой, а RPC-ответ отправки не доказывает изменение state. Прочитайте статус транзакции Solana, затем состояние Token Account после подтверждения. Перед approve проверьте, что подписывает кошелёк: source, delegate и raw amount должны совпадать с ожидаемым действием.
Permanent Delegate находится в mint, а не в поле account delegate
Расширение PermanentDelegate существует в Token-2022 Mint Account. Такая mint-level authority может подписывать transfer и burn из любого Token Account этого mint; владелец отдельного account не может убрать её инструкцией Revoke. Mint authority может ротировать это полномочие через SetAuthority. Поэтому `delegate=None` в Token Account доказывает отсутствие только обычного account-level delegate, но не отсутствие полномочий эмитента.
| Наблюдение | Что это означает | Восстановление или stop |
|---|---|---|
| Delegate знаком, amount ожидаем | Активное ограниченное разрешение | Оставить только если задача ещё нужна; иначе revoke |
| Delegate неизвестен, owner key безопасен | Риск transfer/burn до allowance | Не делать новые approve; отправить Revoke и подтвердить state |
| Delegate неизвестен, owner key мог утечь | Revoke может соревноваться с расходом | Мигрировать оставшийся баланс на новый owner/account и расследовать подписи |
| Account frozen | Transfer, burn и delegate changes заблокированы | Не обещать revoke до thaw; проверить freeze authority mint |
| Account delegate пуст, mint имеет PermanentDelegate | Account-level revoke неприменим | Оценить риск mint authority; не считать локальный state полной гарантией |
- Наблюдение
- Delegate знаком, amount ожидаем
- Что это означает
- Активное ограниченное разрешение
- Восстановление или stop
- Оставить только если задача ещё нужна; иначе revoke
- Наблюдение
- Delegate неизвестен, owner key безопасен
- Что это означает
- Риск transfer/burn до allowance
- Восстановление или stop
- Не делать новые approve; отправить Revoke и подтвердить state
- Наблюдение
- Delegate неизвестен, owner key мог утечь
- Что это означает
- Revoke может соревноваться с расходом
- Восстановление или stop
- Мигрировать оставшийся баланс на новый owner/account и расследовать подписи
- Наблюдение
- Account frozen
- Что это означает
- Transfer, burn и delegate changes заблокированы
- Восстановление или stop
- Не обещать revoke до thaw; проверить freeze authority mint
- Наблюдение
- Account delegate пуст, mint имеет PermanentDelegate
- Что это означает
- Account-level revoke неприменим
- Восстановление или stop
- Оценить риск mint authority; не считать локальный state полной гарантией
Итоговый доказательный пакет включает cluster, program ID, mint, Token Account, owner, delegate/delegatedAmount до и после, signature approve/revoke и slot чтения. Остановитесь, если интерфейс не показывает source account, сумму дана без decimals, transaction не подтверждена, account frozen или обнаружен Permanent Delegate. Revoke — защита на будущее для одного account, не возврат активов и не отзыв полномочий всего mint.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Solana Docs — Approve Delegate Solana Foundation · Проверено 21 августа 2026 г. в 22:07 GMT+5
- Solana Docs — Revoke Delegate Solana Foundation · Проверено 21 августа 2026 г. в 22:07 GMT+5
- Solana Docs — Spend permissions Solana Foundation · Проверено 21 августа 2026 г. в 22:07 GMT+5
- Solana Docs — Permanent Delegate Solana Foundation · Проверено 21 августа 2026 г. в 22:07 GMT+5
