Один тикер может скрывать другой AssetId или Assets instance
Для local/native assets обычно проверяют числовой AssetId в конкретном Assets pallet instance. Foreign assets могут использовать XCM location и другой instance. Symbol, name и decimals — metadata: они помогают отобразить сумму, но не являются уникальным идентификатором. Сохраните pallet instance, raw AssetId/location, metadata и finalized block hash.
| Поле | Источник | Роль в диагностике |
|---|---|---|
| Chain identity | Genesis/chain spec + runtime version | Исключает relay chain, Kusama Hub и test networks |
| Pallet instance + AssetId | Runtime metadata/storage key | Выбирает конкретный класс актива |
| Metadata | Name, symbol, decimals | Переводит raw amount; не доказывает identity |
| is_sufficient | AssetDetails | Может ли asset balance дать system-account provider reference |
| min_balance | AssetDetails | Минимум для существования asset account |
| status/frozen state | Asset/AssetAccount state | Отделяет lifecycle/freeze от minimum-balance ошибки |
| Fee asset | Signed extension + runtime support | Определяет, чем signer реально оплачивает extrinsic |
- Поле
- Chain identity
- Источник
- Genesis/chain spec + runtime version
- Роль в диагностике
- Исключает relay chain, Kusama Hub и test networks
- Поле
- Pallet instance + AssetId
- Источник
- Runtime metadata/storage key
- Роль в диагностике
- Выбирает конкретный класс актива
- Поле
- Metadata
- Источник
- Name, symbol, decimals
- Роль в диагностике
- Переводит raw amount; не доказывает identity
- Поле
- is_sufficient
- Источник
- AssetDetails
- Роль в диагностике
- Может ли asset balance дать system-account provider reference
- Поле
- min_balance
- Источник
- AssetDetails
- Роль в диагностике
- Минимум для существования asset account
- Поле
- status/frozen state
- Источник
- Asset/AssetAccount state
- Роль в диагностике
- Отделяет lifecycle/freeze от minimum-balance ошибки
- Поле
- Fee asset
- Источник
- Signed extension + runtime support
- Роль в диагностике
- Определяет, чем signer реально оплачивает extrinsic
Decimals применяются только для показа. Например, raw amount сравнивают с raw min_balance до форматирования; округлённая UI-сумма может выглядеть равной порогу, оставаясь ниже на одну минимальную единицу. Отдельный гайд объясняет raw balances и decimals.
Sufficient описывает существование system account, а не качество актива
В pallet-assets sufficient asset может предоставить provider reference: account способен существовать в system state за счёт этого asset balance без отдельного native existential deposit. Для non-sufficient asset требуется уже существующая опора account lifecycle — например, provider от native balance или предварительно созданный asset account с предусмотренным deposit/consumer reference. Сам факт корректного SS58-адреса не означает, что такой onchain account уже существует.
| Receiver | Asset sufficient? | Amount ≥ min_balance? | Ожидание |
|---|---|---|---|
| System account уже существует | Да/нет | Да | Asset account обычно можно создать, если нет других ограничений |
| System account отсутствует | Да | Да | Sufficient asset может дать provider reference |
| System account отсутствует | Нет | Да | Обычный transfer может не создать destination account |
| Любое состояние | Да/нет | Нет | Destination asset account не проходит minimum balance |
- Receiver
- System account уже существует
- Asset sufficient?
- Да/нет
- Amount ≥ min_balance?
- Да
- Ожидание
- Asset account обычно можно создать, если нет других ограничений
- Receiver
- System account отсутствует
- Asset sufficient?
- Да
- Amount ≥ min_balance?
- Да
- Ожидание
- Sufficient asset может дать provider reference
- Receiver
- System account отсутствует
- Asset sufficient?
- Нет
- Amount ≥ min_balance?
- Да
- Ожидание
- Обычный transfer может не создать destination account
- Receiver
- Любое состояние
- Asset sufficient?
- Да/нет
- Amount ≥ min_balance?
- Нет
- Ожидание
- Destination asset account не проходит minimum balance
Minimum balance проверяют и у получателя, и у остатка отправителя
Новый destination asset account нельзя создать суммой ниже min_balance. У sender остаток ниже этого порога также может быть удалён или обработан по правилам точного extrinsic и flags. Поэтому кнопка «отправить всё» и обычный transfer могут давать разные фактические amount/debit behavior. Не подбирайте сумму на глаз: запросите payment/dry-run или runtime API и декодируйте dispatch error.
Runbook для одного transfer
- 1Закрепить chain/runtime
Сохраните genesis, finalized block, specName/specVersion/transactionVersion и metadata. Повторите проверку, если runtime обновился.
- 2Разрешить exact asset
Определите Assets instance и AssetId или foreign location; прочитайте metadata, AssetDetails и status на одном block.
- 3Прочитать receiver state
Отдельно проверьте System.Account и AssetAccount. Адрес без history всё равно может иметь state, а красивый address string может не иметь его.
- 4Сравнить raw amounts
Сопоставьте amount с min_balance и рассчитайте sender remainder. Не округляйте до UI decimals до сравнения.
- 5Выбрать fee path
Укажите native fee или поддерживаемый fee asset. Проверьте balance, настроенный payment/conversion path и signed extension отдельно от transfer asset; ликвидность — только если runtime adapter явно использует pool.
- 6Dry-run exact extrinsic
Используйте актуальные runtime metadata, nonce, era и call. Сохраните decoded error до подписи; stale metadata может давать другой failure.
- 7Проверить finalized result
Подтвердите extrinsic success, receiver AssetAccount balance, sender remainder и фактически списанную fee. Submitted не равно finalized.
Fee asset — отдельный вход транзакции
Asset transaction payment принимает optional AssetId и проводит оплату через настроенный adapter/conversion path. Balance и is_sufficient=true не доказывают, что путь включён. Если wallet выбирает native fee, нужен native balance; для alternative asset должны совпасть exact ID/location и runtime support. Ликвидность проверяют лишь у реализации с pool.
Комиссия зависит от encoded call, weight, length, runtime multiplier и выбранного payment path. Оценка из другого block или другой сети не подходит. Общая страница сетевых комиссий полезна для единиц измерения, но source of truth здесь — актуальный Asset Hub runtime.
Dispatch error превращают в проверяемую ветку
| Наблюдение | Что проверить | Действие |
|---|---|---|
| Asset/metadata не найден | Chain, pallet instance, AssetId/location | Остановиться: тикер взят не из той сети |
| Destination cannot be created | is_sufficient, System.Account, AssetAccount | Создать допустимую account опору штатным способом или выбрать sufficient asset |
| Balance low/minimum error | Raw amount и min_balance | Увеличить amount только после проверки sender remainder и intent |
| Payment error до dispatch | Fee asset ID, balance, supported conversion | Выбрать подтверждённый fee path; не менять transfer asset вслепую |
| Stale/invalid transaction | specVersion, transactionVersion, metadata, nonce/era | Пересобрать с текущим runtime state |
| Extrinsic finalized с ошибкой | DispatchError module/index по той же metadata | Декодировать точный pallet error и не считать перевод выполненным |
- Наблюдение
- Asset/metadata не найден
- Что проверить
- Chain, pallet instance, AssetId/location
- Действие
- Остановиться: тикер взят не из той сети
- Наблюдение
- Destination cannot be created
- Что проверить
- is_sufficient, System.Account, AssetAccount
- Действие
- Создать допустимую account опору штатным способом или выбрать sufficient asset
- Наблюдение
- Balance low/minimum error
- Что проверить
- Raw amount и min_balance
- Действие
- Увеличить amount только после проверки sender remainder и intent
- Наблюдение
- Payment error до dispatch
- Что проверить
- Fee asset ID, balance, supported conversion
- Действие
- Выбрать подтверждённый fee path; не менять transfer asset вслепую
- Наблюдение
- Stale/invalid transaction
- Что проверить
- specVersion, transactionVersion, metadata, nonce/era
- Действие
- Пересобрать с текущим runtime state
- Наблюдение
- Extrinsic finalized с ошибкой
- Что проверить
- DispatchError module/index по той же metadata
- Действие
- Декодировать точный pallet error и не считать перевод выполненным
Как проверить транзакцию: сохраните chain identity, runtime versions, finalized block, pallet/AssetId, metadata, is_sufficient, min_balance, receiver System/AssetAccount state, sender/receiver raw amounts, fee asset, dry-run, extrinsic hash и dispatch result. После success нужно подтвердить перевод, а не только включение extrinsic в блок.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Polkadot Developer Docs — Polkadot Hub Assets Polkadot · Проверено 24 августа 2026 г. в 11:17 GMT+5
- Polkadot Developer Docs — run a Polkadot Hub node Polkadot · Проверено 24 августа 2026 г. в 11:17 GMT+5
- Polkadot SDK — Assets pallet Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Polkadot SDK — AssetDetails Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Polkadot SDK — Assets transfer behavior Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Polkadot SDK — asset transaction payment Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
- Polkadot Fellowship — production runtimes and releases Polkadot Technical Fellowship · Проверено 24 августа 2026 г. в 09:25 GMT+5
