Один тикер может скрывать другой 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.

Минимальная карточка exact asset
ПолеИсточникРоль в диагностике
Chain identityGenesis/chain spec + runtime versionИсключает relay chain, Kusama Hub и test networks
Pallet instance + AssetIdRuntime metadata/storage keyВыбирает конкретный класс актива
MetadataName, symbol, decimalsПереводит raw amount; не доказывает identity
is_sufficientAssetDetailsМожет ли asset balance дать system-account provider reference
min_balanceAssetDetailsМинимум для существования asset account
status/frozen stateAsset/AssetAccount stateОтделяет lifecycle/freeze от minimum-balance ошибки
Fee assetSigned extension + runtime supportОпределяет, чем signer реально оплачивает extrinsic
Минимальная карточка exact asset
Поле
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 state и ожидаемая ветка
ReceiverAsset 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 state и ожидаемая ветка
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. 1
    Закрепить chain/runtime

    Сохраните genesis, finalized block, specName/specVersion/transactionVersion и metadata. Повторите проверку, если runtime обновился.

  2. 2
    Разрешить exact asset

    Определите Assets instance и AssetId или foreign location; прочитайте metadata, AssetDetails и status на одном block.

  3. 3
    Прочитать receiver state

    Отдельно проверьте System.Account и AssetAccount. Адрес без history всё равно может иметь state, а красивый address string может не иметь его.

  4. 4
    Сравнить raw amounts

    Сопоставьте amount с min_balance и рассчитайте sender remainder. Не округляйте до UI decimals до сравнения.

  5. 5
    Выбрать fee path

    Укажите native fee или поддерживаемый fee asset. Проверьте balance, настроенный payment/conversion path и signed extension отдельно от transfer asset; ликвидность — только если runtime adapter явно использует pool.

  6. 6
    Dry-run exact extrinsic

    Используйте актуальные runtime metadata, nonce, era и call. Сохраните decoded error до подписи; stale metadata может давать другой failure.

  7. 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 превращают в проверяемую ветку

Stop и recovery
НаблюдениеЧто проверитьДействие
Asset/metadata не найденChain, pallet instance, AssetId/locationОстановиться: тикер взят не из той сети
Destination cannot be createdis_sufficient, System.Account, AssetAccountСоздать допустимую account опору штатным способом или выбрать sufficient asset
Balance low/minimum errorRaw amount и min_balanceУвеличить amount только после проверки sender remainder и intent
Payment error до dispatchFee asset ID, balance, supported conversionВыбрать подтверждённый fee path; не менять transfer asset вслепую
Stale/invalid transactionspecVersion, transactionVersion, metadata, nonce/eraПересобрать с текущим runtime state
Extrinsic finalized с ошибкойDispatchError module/index по той же metadataДекодировать точный pallet error и не считать перевод выполненным
Stop и recovery
Наблюдение
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 в блок.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. Polkadot Developer Docs — Polkadot Hub Assets Polkadot · Проверено 24 августа 2026 г. в 11:17 GMT+5
  2. Polkadot Developer Docs — run a Polkadot Hub node Polkadot · Проверено 24 августа 2026 г. в 11:17 GMT+5
  3. Polkadot SDK — Assets pallet Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
  4. Polkadot SDK — AssetDetails Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
  5. Polkadot SDK — Assets transfer behavior Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
  6. Polkadot SDK — asset transaction payment Parity Technologies / Polkadot SDK · Проверено 24 августа 2026 г. в 09:25 GMT+5
  7. Polkadot Fellowship — production runtimes and releases Polkadot Technical Fellowship · Проверено 24 августа 2026 г. в 09:25 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.