From cf02896a587411759d4fb7c244d884ed16cc1b36 Mon Sep 17 00:00:00 2001 From: Satoshi Qazi Muhammed Date: Sat, 11 Jul 2026 14:07:59 -0700 Subject: [PATCH] fix: apply the chain/asset-standard label to the main balance list too The Send/Receive/etc. network picker (NetworkFlowViewModel) already showed "Ethereum (ERC-20)"/"Tron (TRC-20)" for a multi-chain token's per-chain rows, but the main Assets dashboard's own expandable per-token breakdown (tap a token like USDT to see every chain it exists on) is a completely separate code path (TokenAssetMappers/TokenAssetViewHolder) that still showed a bare chain name - found via a real device screenshot of that specific screen. Moved the shared display-name-with-label logic to a public extension (Chain.displayNameWithAssetStandard(), runtime/ext/ChainExt.kt) so both screens build the exact same string instead of duplicating (and now diverging) the same logic twice. --- .../balance/common/mappers/TokenAssetMappers.kt | 12 ++++++++++-- .../flow/network/NetworkFlowViewModel.kt | 9 +-------- .../io/novafoundation/nova/runtime/ext/ChainExt.kt | 12 ++++++++++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/TokenAssetMappers.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/TokenAssetMappers.kt index a299abf8..7ecf6276 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/TokenAssetMappers.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/common/mappers/TokenAssetMappers.kt @@ -6,7 +6,8 @@ import io.novafoundation.nova.common.presentation.AssetIconProvider import io.novafoundation.nova.common.presentation.getAssetIconOrFallback import io.novafoundation.nova.common.utils.formatting.formatAsChange import io.novafoundation.nova.common.utils.orZero -import io.novafoundation.nova.feature_account_api.data.mappers.mapChainToUi +import io.novafoundation.nova.feature_account_api.presenatation.chain.ChainUi +import io.novafoundation.nova.runtime.ext.displayNameWithAssetStandard import io.novafoundation.nova.feature_assets.R import io.novafoundation.nova.feature_account_api.presenatation.chain.getAssetIconOrFallback import io.novafoundation.nova.feature_assets.domain.common.AssetWithNetwork @@ -90,7 +91,14 @@ class TokenAssetFormatter( group.getId(), mapAssetToAssetModel(it.asset, balance(it.balanceWithOffChain)), assetIconProvider.getAssetIconOrFallback(it.asset.token.configuration), - mapChainToUi(it.chain) + // Not mapChainToUi() here - this row's subtitle needs to disambiguate which issuance of the + // token this is (e.g. "Ethereum (ERC-20)" vs "Tron (TRC-20)"), which a bare chain name alone + // doesn't when multiple ecosystems share the same symbol (USDT, USDC, etc.). + ChainUi( + id = it.chain.id, + name = it.chain.displayNameWithAssetStandard(), + icon = it.chain.icon + ) ) } } diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/flow/network/NetworkFlowViewModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/flow/network/NetworkFlowViewModel.kt index eeac28fc..35dc6de4 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/flow/network/NetworkFlowViewModel.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/flow/network/NetworkFlowViewModel.kt @@ -16,10 +16,9 @@ import io.novafoundation.nova.feature_assets.presentation.flow.network.model.Net import io.novafoundation.nova.feature_wallet_api.presentation.formatters.amount.AmountFormatter import io.novafoundation.nova.feature_wallet_api.presentation.formatters.amount.formatAmountToAmountModel import io.novafoundation.nova.feature_wallet_api.presentation.formatters.amount.model.AmountConfig -import io.novafoundation.nova.runtime.ext.assetStandardLabelOrNull +import io.novafoundation.nova.runtime.ext.displayNameWithAssetStandard import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry import io.novafoundation.nova.runtime.multiNetwork.asset -import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map @@ -85,10 +84,4 @@ abstract class NetworkFlowViewModel( ) } } - - private fun Chain.displayNameWithAssetStandard(): String { - val standardLabel = assetStandardLabelOrNull ?: return name - - return "$name ($standardLabel)" - } } diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainExt.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainExt.kt index ecc3f540..debf3e53 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainExt.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainExt.kt @@ -515,6 +515,18 @@ val Chain.assetStandardLabelOrNull: String? else -> null } +/** + * Chain display name with its token-standard label appended where [assetStandardLabelOrNull] applies, e.g. + * "Ethereum (ERC-20)". Shared across every screen that lists the same token symbol once per chain (the + * Send/Receive/etc. network picker, the main balance list's per-token chain breakdown) - a bare chain name + * alone doesn't convey which issuance this is when multiple ecosystems share the same symbol. + */ +fun Chain.displayNameWithAssetStandard(): String { + val standardLabel = assetStandardLabelOrNull ?: return name + + return "$name ($standardLabel)" +} + fun Chain.Asset.requireStatemine(): Type.Statemine { require(type is Type.Statemine)