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 bc7da05a..eeac28fc 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,8 +16,10 @@ 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.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 @@ -73,7 +75,7 @@ abstract class NetworkFlowViewModel( NetworkFlowRvItem( it.chain.id, it.asset.token.configuration.id, - it.chain.name, + it.chain.displayNameWithAssetStandard(), it.chain.icon, amountFormatter.formatAmountToAmountModel( amount = getAssetBalance(it).amount, @@ -83,4 +85,10 @@ 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 51e1a19f..ecc3f540 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 @@ -488,6 +488,7 @@ object ChainGeneses { object ChainIds { const val ETHEREUM = "$EIP_155_PREFIX:1" + const val TRON = "tron:0x2b6653dc" const val MOONBEAM = ChainGeneses.MOONBEAM const val MOONRIVER = ChainGeneses.MOONRIVER @@ -499,6 +500,21 @@ val Chain.Companion.Geneses val Chain.Companion.Ids get() = ChainIds +/** + * A short, user-facing token-standard label for chains where disambiguating "which token standard is this" + * is actually useful (multiple ecosystems all issue their own USDT/USDC etc., so a bare chain name isn't + * always enough context). Deliberately NOT derived from [Chain.Asset.Type] (e.g. every Statemine-type chain + * would get the same label) - this is chain-specific by design, matching exactly which labels are + * recognizable/expected by users (PEZ-20, ERC-20, TRC-20), not a mechanical one-label-per-asset-type mapping. + */ +val Chain.assetStandardLabelOrNull: String? + get() = when { + genesisHash == Chain.Geneses.PEZKUWI_ASSET_HUB -> "PEZ-20" + id == Chain.Ids.ETHEREUM -> "ERC-20" + id == Chain.Ids.TRON -> "TRC-20" + else -> null + } + fun Chain.Asset.requireStatemine(): Type.Statemine { require(type is Type.Statemine) diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainSorting.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainSorting.kt index 1b8fcd49..9c41b816 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainSorting.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/ext/ChainSorting.kt @@ -3,19 +3,23 @@ package io.novafoundation.nova.runtime.ext import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain val Chain.mainChainsFirstAscendingOrder - get() = when (genesisHash) { + get() = when { // Pezkuwi ecosystem first - Chain.Geneses.PEZKUWI -> 0 - Chain.Geneses.PEZKUWI_ASSET_HUB -> 1 - Chain.Geneses.PEZKUWI_PEOPLE -> 2 + genesisHash == Chain.Geneses.PEZKUWI -> 0 + genesisHash == Chain.Geneses.PEZKUWI_ASSET_HUB -> 1 + genesisHash == Chain.Geneses.PEZKUWI_PEOPLE -> 2 // Then Polkadot ecosystem - Chain.Geneses.POLKADOT -> 3 - Chain.Geneses.POLKADOT_ASSET_HUB -> 4 + genesisHash == Chain.Geneses.POLKADOT -> 3 + genesisHash == Chain.Geneses.POLKADOT_ASSET_HUB -> 4 // Then Kusama ecosystem - Chain.Geneses.KUSAMA -> 5 - Chain.Geneses.KUSAMA_ASSET_HUB -> 6 + genesisHash == Chain.Geneses.KUSAMA -> 5 + genesisHash == Chain.Geneses.KUSAMA_ASSET_HUB -> 6 + // Then Ethereum, then Tron - not identified by genesisHash (that's substrate-only), so this can't + // stay a `when (genesisHash)` subject match once these two are added + id == Chain.Ids.ETHEREUM -> 7 + id == Chain.Ids.TRON -> 8 // Everything else - else -> 7 + else -> 9 } val Chain.testnetsLastAscendingOrder