From 9c7bb7c6e950576638febe75b9705710c3ea73c6 Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Tue, 17 Feb 2026 06:13:59 +0300 Subject: [PATCH] Prepare for Play Store release: simplify dashboard, clean debug logs - Simplify dashboard card: remove referral/staking/perwerde fields (not yet on-chain), keep roles + trust score + action button - Remove all debug Log.d/e/w calls added during development (PEZ_STAKE, RuntimeFactory, ExtrinsicBuilder, etc.) - Change Play Store track from beta to production - Add release notes (whatsnew-en-US) --- app/build.gradle | 2 +- .../common/utils/PezkuwiAddressConstructor.kt | 23 ---- common/src/main/res/values-es/strings.xml | 3 - common/src/main/res/values-fr-rFR/strings.xml | 3 - common/src/main/res/values-hu/strings.xml | 3 - common/src/main/res/values-in/strings.xml | 3 - common/src/main/res/values-it/strings.xml | 3 - common/src/main/res/values-ja/strings.xml | 3 - common/src/main/res/values-ko/strings.xml | 3 - common/src/main/res/values-ku/strings.xml | 3 - common/src/main/res/values-pl/strings.xml | 3 - common/src/main/res/values-pt/strings.xml | 3 - common/src/main/res/values-ru/strings.xml | 3 - common/src/main/res/values-tr/strings.xml | 3 - common/src/main/res/values-vi/strings.xml | 3 - common/src/main/res/values-zh-rCN/strings.xml | 3 - common/src/main/res/values/strings.xml | 3 - distribution/whatsnew/whatsnew-en-US | 7 ++ .../data/extrinsic/RealExtrinsicService.kt | 34 +----- .../data/model/PezkuwiDashboardData.kt | 5 +- .../repository/PezkuwiDashboardRepository.kt | 71 +----------- .../balance/list/BalanceListViewModel.kt | 5 +- .../list/model/PezkuwiDashboardModel.kt | 5 +- .../list/view/PezkuwiDashboardAdapter.kt | 3 - .../res/layout/item_pezkuwi_dashboard.xml | 109 +++--------------- .../domain/common/StakingSharedComputation.kt | 54 +++------ .../direct/DirectStakingProperties.kt | 6 +- .../direct/DirectStakingRecommendation.kt | 26 +---- .../pools/NominationPoolRecommendation.kt | 18 +-- .../AutomaticMultiStakingSelectionType.kt | 20 +--- .../extrinsic/CustomTransactionExtensions.kt | 6 - .../extrinsic/ExtrinsicBuilderFactory.kt | 15 --- .../multiNetwork/runtime/RuntimeFactory.kt | 15 +-- .../network/updaters/BlockNumberUpdater.kt | 2 - .../nova/runtime/util/AccountLookup.kt | 15 +-- 35 files changed, 53 insertions(+), 433 deletions(-) create mode 100644 distribution/whatsnew/whatsnew-en-US diff --git a/app/build.gradle b/app/build.gradle index a53e173..20a6f07 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -168,7 +168,7 @@ void createBindReleaseFileTask(String destination) { play { serviceAccountCredentials = file(System.env.CI_PLAY_KEY ?: "../key/fake.json") - track = "beta" + track = "production" releaseStatus = "completed" } diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/PezkuwiAddressConstructor.kt b/common/src/main/java/io/novafoundation/nova/common/utils/PezkuwiAddressConstructor.kt index 9cab718..47b3493 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/PezkuwiAddressConstructor.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/PezkuwiAddressConstructor.kt @@ -1,6 +1,5 @@ package io.novafoundation.nova.common.utils -import android.util.Log import io.novasama.substrate_sdk_android.runtime.AccountId import io.novasama.substrate_sdk_android.runtime.definitions.registry.TypeRegistry import io.novasama.substrate_sdk_android.runtime.definitions.types.composite.DictEnum @@ -8,8 +7,6 @@ import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.MULT import io.novasama.substrate_sdk_android.runtime.definitions.types.primitives.FixedByteArray import io.novasama.substrate_sdk_android.runtime.definitions.types.skipAliases -private const val TAG = "PezkuwiAddressConstructor" - /** * Custom address constructor that handles Pezkuwi chains which use different type names. * Pezkuwi uses "pezsp_runtime::multiaddress::MultiAddress" instead of standard "Address". @@ -28,59 +25,39 @@ object PezkuwiAddressConstructor { * Checks the actual type structure to determine the correct encoding format. */ fun constructInstance(typeRegistry: TypeRegistry, accountId: AccountId): Any { - // Try to find the address type var foundTypeName: String? = null val addressType = ADDRESS_TYPE_NAMES.firstNotNullOfOrNull { name -> typeRegistry[name]?.also { foundTypeName = name } } - Log.d(TAG, "Found address type: $foundTypeName, type class: ${addressType?.javaClass?.simpleName}") - - // If no address type found, return the raw accountId (for chains with simple AccountId) if (addressType == null) { - Log.d(TAG, "No address type found, returning raw accountId") return accountId } val resolvedType = addressType.skipAliases() - Log.d(TAG, "Resolved type after skipAliases: ${resolvedType?.javaClass?.simpleName}, name: ${resolvedType?.name}") - // Check the actual type structure return when (resolvedType) { is DictEnum -> { - // Use the actual variant name from the type - // Standard chains use "Id", but Pezkuwi uses numeric variants like "0" val variantNames = resolvedType.elements.values.map { it.name } - Log.d(TAG, "Type is DictEnum with variants: $variantNames") - // Use "Id" if available, otherwise use the first variant (index 0) val idVariantName = if (variantNames.contains(MULTI_ADDRESS_ID)) { MULTI_ADDRESS_ID } else { resolvedType.elements[0]?.name ?: MULTI_ADDRESS_ID } - Log.d(TAG, "Using variant name: $idVariantName") DictEnum.Entry(idVariantName, accountId) } is FixedByteArray -> { - Log.d(TAG, "Type is FixedByteArray with length: ${resolvedType.length}, returning raw accountId") - // GenericAccountId or similar - return raw accountId } null -> { - Log.d(TAG, "Resolved type is null for type: $foundTypeName") - // If this is a MultiAddress type that couldn't resolve, use variant "0" if (foundTypeName?.contains("MultiAddress") == true || foundTypeName?.contains("multiaddress") == true) { - Log.d(TAG, "Type appears to be MultiAddress, using variant 0") DictEnum.Entry("0", accountId) } else { - Log.d(TAG, "Returning raw accountId") accountId } } else -> { - Log.d(TAG, "Unknown type: ${resolvedType.javaClass.simpleName}, returning raw accountId") - // Unknown type, try raw accountId instead of DictEnum accountId } } diff --git a/common/src/main/res/values-es/strings.xml b/common/src/main/res/values-es/strings.xml index 4000266..0ea856d 100644 --- a/common/src/main/res/values-es/strings.xml +++ b/common/src/main/res/values-es/strings.xml @@ -2047,8 +2047,5 @@ Pezkuwi Puntuación de confianza - Referido - Staking - Perwerde Solicitar y Acciones diff --git a/common/src/main/res/values-fr-rFR/strings.xml b/common/src/main/res/values-fr-rFR/strings.xml index 423eae2..d664719 100644 --- a/common/src/main/res/values-fr-rFR/strings.xml +++ b/common/src/main/res/values-fr-rFR/strings.xml @@ -2047,8 +2047,5 @@ Pezkuwi Score de confiance - Parrainage - Staking - Perwerde Demande et Actions diff --git a/common/src/main/res/values-hu/strings.xml b/common/src/main/res/values-hu/strings.xml index 73fb814..1ad5874 100644 --- a/common/src/main/res/values-hu/strings.xml +++ b/common/src/main/res/values-hu/strings.xml @@ -2047,8 +2047,5 @@ Pezkuwi Bizalmi pontszám - Ajánlás - Staking - Perwerde Jelentkezés és Műveletek diff --git a/common/src/main/res/values-in/strings.xml b/common/src/main/res/values-in/strings.xml index 3f40ca8..ab7c44f 100644 --- a/common/src/main/res/values-in/strings.xml +++ b/common/src/main/res/values-in/strings.xml @@ -2033,8 +2033,5 @@ Pezkuwi Skor Kepercayaan - Referral - Staking - Perwerde Ajukan & Tindakan diff --git a/common/src/main/res/values-it/strings.xml b/common/src/main/res/values-it/strings.xml index f70fa5d..61505e8 100644 --- a/common/src/main/res/values-it/strings.xml +++ b/common/src/main/res/values-it/strings.xml @@ -2047,8 +2047,5 @@ Pezkuwi Punteggio di fiducia - Referral - Staking - Perwerde Richiesta e Azioni diff --git a/common/src/main/res/values-ja/strings.xml b/common/src/main/res/values-ja/strings.xml index dba344f..0f861f3 100644 --- a/common/src/main/res/values-ja/strings.xml +++ b/common/src/main/res/values-ja/strings.xml @@ -2033,8 +2033,5 @@ Pezkuwi 信頼スコア - 紹介 - ステーキング - Perwerde 申請とアクション diff --git a/common/src/main/res/values-ko/strings.xml b/common/src/main/res/values-ko/strings.xml index db9681b..830ae8a 100644 --- a/common/src/main/res/values-ko/strings.xml +++ b/common/src/main/res/values-ko/strings.xml @@ -2033,8 +2033,5 @@ Pezkuwi 신뢰 점수 - 추천 - 스테이킹 - Perwerde 신청 및 작업 diff --git a/common/src/main/res/values-ku/strings.xml b/common/src/main/res/values-ku/strings.xml index 62c22ce..7601027 100644 --- a/common/src/main/res/values-ku/strings.xml +++ b/common/src/main/res/values-ku/strings.xml @@ -2760,8 +2760,5 @@ Pezkuwi Pûana Pêbaweriyê - Referral - Staking - Perwerde Serlêdan û Karên diff --git a/common/src/main/res/values-pl/strings.xml b/common/src/main/res/values-pl/strings.xml index 7ba546c..7f25084 100644 --- a/common/src/main/res/values-pl/strings.xml +++ b/common/src/main/res/values-pl/strings.xml @@ -2075,8 +2075,5 @@ Pezkuwi Wynik zaufania - Polecenie - Staking - Perwerde Wniosek i Akcje diff --git a/common/src/main/res/values-pt/strings.xml b/common/src/main/res/values-pt/strings.xml index 8dd0bfd..d879c2a 100644 --- a/common/src/main/res/values-pt/strings.xml +++ b/common/src/main/res/values-pt/strings.xml @@ -2047,8 +2047,5 @@ Pezkuwi Pontuação de confiança - Indicação - Staking - Perwerde Candidatura e Ações diff --git a/common/src/main/res/values-ru/strings.xml b/common/src/main/res/values-ru/strings.xml index 981876d..dc9b224 100644 --- a/common/src/main/res/values-ru/strings.xml +++ b/common/src/main/res/values-ru/strings.xml @@ -2075,8 +2075,5 @@ Pezkuwi Рейтинг доверия - Реферал - Стейкинг - Perwerde Заявка и Действия diff --git a/common/src/main/res/values-tr/strings.xml b/common/src/main/res/values-tr/strings.xml index f7dd37b..e92ab9d 100644 --- a/common/src/main/res/values-tr/strings.xml +++ b/common/src/main/res/values-tr/strings.xml @@ -2,8 +2,5 @@ Pezkuwi Güven Puanı - Referans - Staking - Perwerde Başvuru ve İşlemler diff --git a/common/src/main/res/values-vi/strings.xml b/common/src/main/res/values-vi/strings.xml index 94610f7..0365235 100644 --- a/common/src/main/res/values-vi/strings.xml +++ b/common/src/main/res/values-vi/strings.xml @@ -2033,8 +2033,5 @@ Pezkuwi Điểm tin cậy - Giới thiệu - Staking - Perwerde Đăng ký & Hành động diff --git a/common/src/main/res/values-zh-rCN/strings.xml b/common/src/main/res/values-zh-rCN/strings.xml index d5fd66f..caa278c 100644 --- a/common/src/main/res/values-zh-rCN/strings.xml +++ b/common/src/main/res/values-zh-rCN/strings.xml @@ -2033,8 +2033,5 @@ Pezkuwi 信任评分 - 推荐 - 质押 - Perwerde 申请与操作 diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index fcf5c40..a99ef59 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -2762,8 +2762,5 @@ Pezkuwi Trust Score - Referral - Staking - Perwerde Apply & Actions diff --git a/distribution/whatsnew/whatsnew-en-US b/distribution/whatsnew/whatsnew-en-US new file mode 100644 index 0000000..46c07bd --- /dev/null +++ b/distribution/whatsnew/whatsnew-en-US @@ -0,0 +1,7 @@ +Pezkuwi Wallet - Your gateway to the Pezkuwi blockchain ecosystem. + +- Send and receive HEZ tokens +- Stake HEZ via nomination pools on Asset Hub +- View your Pezkuwi dashboard with roles and trust score +- Multi-chain support for Polkadot ecosystem +- Secure account management with biometric authentication diff --git a/feature-account-impl/src/main/java/io/novafoundation/nova/feature_account_impl/data/extrinsic/RealExtrinsicService.kt b/feature-account-impl/src/main/java/io/novafoundation/nova/feature_account_impl/data/extrinsic/RealExtrinsicService.kt index 6d83546..19b1092 100644 --- a/feature-account-impl/src/main/java/io/novafoundation/nova/feature_account_impl/data/extrinsic/RealExtrinsicService.kt +++ b/feature-account-impl/src/main/java/io/novafoundation/nova/feature_account_impl/data/extrinsic/RealExtrinsicService.kt @@ -350,39 +350,7 @@ class RealExtrinsicService( } // Build extrinsic - val extrinsic = try { - Log.d("RealExtrinsicService", "Building extrinsic for chain ${chain.name} (${chain.id})") - extrinsicBuilder.buildExtrinsic() - } catch (e: Exception) { - Log.e("RealExtrinsicService", "Failed to build extrinsic for chain ${chain.name}", e) - Log.e("RealExtrinsicService", "SigningMode: $signingMode, Chain: ${chain.id}") - Log.e("RealExtrinsicService", "Exception class: ${e::class.java.name}") - Log.e("RealExtrinsicService", "Message: ${e.message}") - Log.e("RealExtrinsicService", "Cause: ${e.cause?.message}") - Log.e("RealExtrinsicService", "Full stack trace:", e) - - // Get runtime diagnostics - try { - val runtime = chainRegistry.getRuntime(chain.id) - val typeRegistry = runtime.typeRegistry - val hasExtrinsicSignature = typeRegistry["ExtrinsicSignature"] != null - val hasMultiSignature = typeRegistry["MultiSignature"] != null - val hasMultiAddress = typeRegistry["MultiAddress"] != null - val hasAddress = typeRegistry["Address"] != null - Log.e( - "RealExtrinsicService", - "Types: ExtrinsicSig=$hasExtrinsicSignature, MultiSig=$hasMultiSignature, " + - "MultiAddress=$hasMultiAddress, Address=$hasAddress" - ) - - // Check extrinsic extensions - val signedExtensions = runtime.metadata.extrinsic.signedExtensions.map { it.id } - Log.e("RealExtrinsicService", "Signed extensions: $signedExtensions") - } catch (diagEx: Exception) { - Log.e("RealExtrinsicService", "Failed to get diagnostics: ${diagEx.message}") - } - throw e - } + val extrinsic = extrinsicBuilder.buildExtrinsic() val signingHierarchy = signer.getSigningHierarchy() diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/model/PezkuwiDashboardData.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/model/PezkuwiDashboardData.kt index f57589f..ca64737 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/model/PezkuwiDashboardData.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/model/PezkuwiDashboardData.kt @@ -4,8 +4,5 @@ import java.math.BigInteger data class PezkuwiDashboardData( val roles: List, - val trustScore: BigInteger, - val totalReferrals: Int, - val stakedAmount: BigInteger, - val perwerdePoints: Int + val trustScore: BigInteger ) diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/repository/PezkuwiDashboardRepository.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/repository/PezkuwiDashboardRepository.kt index 4af84c6..9a89403 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/repository/PezkuwiDashboardRepository.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/data/repository/PezkuwiDashboardRepository.kt @@ -1,15 +1,12 @@ package io.novafoundation.nova.feature_assets.data.repository -import io.novafoundation.nova.common.data.network.runtime.binding.bindInt import io.novafoundation.nova.common.data.network.runtime.binding.bindNumber import io.novafoundation.nova.common.data.network.runtime.binding.castToDictEnum import io.novafoundation.nova.common.data.network.runtime.binding.castToList -import io.novafoundation.nova.common.data.network.runtime.binding.castToStruct import io.novafoundation.nova.feature_assets.data.model.PezkuwiDashboardData import io.novafoundation.nova.runtime.ext.ChainGeneses import io.novafoundation.nova.runtime.storage.source.StorageDataSource import io.novasama.substrate_sdk_android.runtime.AccountId -import io.novasama.substrate_sdk_android.runtime.definitions.types.composite.DictEnum import io.novasama.substrate_sdk_android.runtime.metadata.moduleOrNull import io.novasama.substrate_sdk_android.runtime.metadata.storage import java.math.BigInteger @@ -23,16 +20,10 @@ class PezkuwiDashboardRepository( val roles = queryRoles(chainId, accountId) val trustScore = queryTrustScore(chainId, accountId) - val totalReferrals = queryReferrals(chainId, accountId) - val stakedAmount = queryStakedAmount(chainId, accountId) - val perwerdePoints = queryPerwerdePoints(chainId, accountId) return PezkuwiDashboardData( roles = roles, - trustScore = trustScore, - totalReferrals = totalReferrals, - stakedAmount = stakedAmount, - perwerdePoints = perwerdePoints + trustScore = trustScore ) } @@ -56,64 +47,4 @@ class PezkuwiDashboardRepository( }) } }.getOrDefault(BigInteger.ZERO) - - private suspend fun queryReferrals(chainId: String, accountId: AccountId): Int = runCatching { - remoteStorageDataSource.query(chainId) { - val referralModule = runtime.metadata.moduleOrNull("Referral") ?: return@query 0 - referralModule.storage("ReferrerStatsStorage").query(accountId, binding = { decoded -> - decoded?.castToStruct()?.let { struct -> - bindInt(struct["total_referrals"]) - } ?: 0 - }) - } - }.getOrDefault(0) - - private suspend fun queryStakedAmount(chainId: String, accountId: AccountId): BigInteger = runCatching { - remoteStorageDataSource.query(chainId) { - val stakingModule = runtime.metadata.moduleOrNull("StakingScore") ?: return@query BigInteger.ZERO - - val relayChainKey = DictEnum.Entry("RelayChain", null) - val assetHubKey = DictEnum.Entry("AssetHub", null) - - val relayStaked = runCatching { - stakingModule.storage("CachedStakingDetails").query(accountId, relayChainKey, binding = { decoded -> - decoded?.castToStruct()?.let { struct -> - bindNumber(struct["staked_amount"]) - } ?: BigInteger.ZERO - }) - }.getOrDefault(BigInteger.ZERO) - - val assetHubStaked = runCatching { - stakingModule.storage("CachedStakingDetails").query(accountId, assetHubKey, binding = { decoded -> - decoded?.castToStruct()?.let { struct -> - bindNumber(struct["staked_amount"]) - } ?: BigInteger.ZERO - }) - }.getOrDefault(BigInteger.ZERO) - - relayStaked.add(assetHubStaked) - } - }.getOrDefault(BigInteger.ZERO) - - private suspend fun queryPerwerdePoints(chainId: String, accountId: AccountId): Int = runCatching { - remoteStorageDataSource.query(chainId) { - val perwerdeModule = runtime.metadata.moduleOrNull("Perwerde") ?: return@query 0 - - val courseIds = perwerdeModule.storage("StudentCourses").query(accountId, binding = { decoded -> - decoded?.castToList()?.map { bindInt(it) } ?: emptyList() - }) - - if (courseIds.isEmpty()) return@query 0 - - courseIds.sumOf { courseId -> - runCatching { - perwerdeModule.storage("Enrollments").query(courseId, accountId, binding = { decoded -> - decoded?.castToStruct()?.let { struct -> - bindInt(struct["points_earned"]) - } ?: 0 - }) - }.getOrDefault(0) - } - } - }.getOrDefault(0) } diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt index fb4882a..6343845 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt @@ -228,10 +228,7 @@ class BalanceListViewModel( .map { data -> PezkuwiDashboardModel( roles = data.roles, - trustScore = data.trustScore.toString(), - referralPoints = data.totalReferrals.toString(), - stakingPoints = data.stakedAmount.toString(), - perwerdePoints = data.perwerdePoints.toString() + trustScore = data.trustScore.toString() ) } .getOrNull() diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt index a733505..979426e 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt @@ -2,8 +2,5 @@ package io.novafoundation.nova.feature_assets.presentation.balance.list.model data class PezkuwiDashboardModel( val roles: List, - val trustScore: String, - val referralPoints: String, - val stakingPoints: String, - val perwerdePoints: String + val trustScore: String ) diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt index ba1d458..79bd358 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt @@ -58,9 +58,6 @@ class PezkuwiDashboardHolder( fun bind(model: PezkuwiDashboardModel) { bindRoles(model.roles) binder.pezkuwiDashboardTrustValue.text = model.trustScore - binder.pezkuwiDashboardReferralValue.text = model.referralPoints - binder.pezkuwiDashboardStakingValue.text = model.stakingPoints - binder.pezkuwiDashboardPerwerdeValue.text = model.perwerdePoints } private fun bindRoles(roles: List) { diff --git a/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml b/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml index c4d6609..1022963 100644 --- a/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml +++ b/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml @@ -37,106 +37,23 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" - android:orientation="horizontal"> + android:orientation="vertical"> - + android:text="@string/pezkuwi_dashboard_trust_score" + android:textColor="#B0BEC5" + android:textSize="12sp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_marginTop="2dp" + android:textColor="@android:color/white" + android:textSize="16sp" + android:textStyle="bold" /> - Log.d("PEZ_STAKE", "electedExposures: fetching validators for chainId=$chainId, era=$eraIndex") - try { - val exposures = stakingRepository.getElectedValidatorsExposure(chainId, eraIndex) - Log.d("PEZ_STAKE", "electedExposures: got ${exposures.size} validators for chainId=$chainId") - exposures to eraIndex - } catch (e: Exception) { - Log.e("PEZ_STAKE", "electedExposures: FAILED for chainId=$chainId, era=$eraIndex", e) - throw e - } + val exposures = stakingRepository.getElectedValidatorsExposure(chainId, eraIndex) + exposures to eraIndex } } } @@ -98,32 +87,23 @@ class StakingSharedComputation( return computationalCache.useSharedFlow(key, scope) { electedExposuresWithActiveEraFlow(chainId, scope).map { (exposures, activeEraIndex) -> - Log.d("PEZ_STAKE", "activeEraInfo: calculating minStake for chainId=$chainId, era=$activeEraIndex, validators=${exposures.size}") - try { - val minBond = stakingRepository.minimumNominatorBond(chainId) - Log.d("PEZ_STAKE", "activeEraInfo: minBond=$minBond") - val bagListLocator = bagListRepository.bagListLocatorOrNull(chainId) - val totalIssuance = totalIssuanceRepository.getTotalIssuance(chainId) - val bagListScoreConverter = BagListScoreConverter.U128(totalIssuance) - val maxElectingVoters = bagListRepository.maxElectingVotes(chainId) - val bagListSize = bagListRepository.bagListSize(chainId) - Log.d("PEZ_STAKE", "activeEraInfo: bagListSize=$bagListSize, maxElectingVoters=$maxElectingVoters") + val minBond = stakingRepository.minimumNominatorBond(chainId) + val bagListLocator = bagListRepository.bagListLocatorOrNull(chainId) + val totalIssuance = totalIssuanceRepository.getTotalIssuance(chainId) + val bagListScoreConverter = BagListScoreConverter.U128(totalIssuance) + val maxElectingVoters = bagListRepository.maxElectingVotes(chainId) + val bagListSize = bagListRepository.bagListSize(chainId) - val minStake = minimumStake( - exposures = exposures.values, - minimumNominatorBond = minBond, - bagListLocator = bagListLocator, - bagListScoreConverter = bagListScoreConverter, - bagListSize = bagListSize, - maxElectingVoters = maxElectingVoters - ) - Log.d("PEZ_STAKE", "activeEraInfo: minStake=$minStake") + val minStake = minimumStake( + exposures = exposures.values, + minimumNominatorBond = minBond, + bagListLocator = bagListLocator, + bagListScoreConverter = bagListScoreConverter, + bagListSize = bagListSize, + maxElectingVoters = maxElectingVoters + ) - ActiveEraInfo(activeEraIndex, exposures, minStake) - } catch (e: Exception) { - Log.e("PEZ_STAKE", "activeEraInfo: FAILED for chainId=$chainId", e) - throw e - } + ActiveEraInfo(activeEraIndex, exposures, minStake) } } } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingProperties.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingProperties.kt index f0d5f53..ae82c35 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingProperties.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingProperties.kt @@ -29,7 +29,6 @@ import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Ba import io.novafoundation.nova.feature_wallet_api.domain.model.Asset import io.novafoundation.nova.feature_wallet_api.domain.validation.sufficientBalance import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain -import android.util.Log import kotlinx.coroutines.CoroutineScope class DirectStakingPropertiesFactory( @@ -102,10 +101,7 @@ private class DirectStakingProperties( private val stakingChainId = stakingOption.chain.parentId ?: stakingOption.chain.id override suspend fun minStake(): Balance { - Log.d("PEZ_STAKE", "DirectStaking.minStake() called, stakingChainId=$stakingChainId") - val result = stakingSharedComputation.minStake(stakingChainId, scope) - Log.d("PEZ_STAKE", "DirectStaking.minStake() returned: $result") - return result + return stakingSharedComputation.minStake(stakingChainId, scope) } private fun StartMultiStakingValidationSystemBuilder.noConflictingStaking() { diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingRecommendation.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingRecommendation.kt index b50ecb1..56f1ad1 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingRecommendation.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/direct/DirectStakingRecommendation.kt @@ -8,7 +8,6 @@ import io.novafoundation.nova.feature_staking_impl.domain.recommendations.settin import io.novafoundation.nova.feature_staking_impl.domain.staking.start.common.selection.StartMultiStakingSelection import io.novafoundation.nova.feature_staking_impl.domain.staking.start.setupAmount.SingleStakingRecommendation import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance -import android.util.Log import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async @@ -21,42 +20,21 @@ class DirectStakingRecommendation( ) : SingleStakingRecommendation { private val recommendator = scope.async { - Log.d("PEZ_STAKE", "DirectRecommendation: creating validator recommender...") - try { - val result = validatorRecommenderFactory.create(scope) - Log.d("PEZ_STAKE", "DirectRecommendation: validator recommender created") - result - } catch (e: Exception) { - Log.e("PEZ_STAKE", "DirectRecommendation: validator recommender FAILED", e) - throw e - } + validatorRecommenderFactory.create(scope) } private val recommendationSettingsProvider = scope.async { - Log.d("PEZ_STAKE", "DirectRecommendation: creating settings provider...") - try { - val result = recommendationSettingsProviderFactory.create(scope) - Log.d("PEZ_STAKE", "DirectRecommendation: settings provider created") - result - } catch (e: Exception) { - Log.e("PEZ_STAKE", "DirectRecommendation: settings provider FAILED", e) - throw e - } + recommendationSettingsProviderFactory.create(scope) } override suspend fun recommendedSelection(stake: Balance): StartMultiStakingSelection { - Log.d("PEZ_STAKE", "DirectRecommendation: awaiting settings provider...") val provider = recommendationSettingsProvider.await() - Log.d("PEZ_STAKE", "DirectRecommendation: got settings provider") val stakingChainId = stakingOption.chain.parentId ?: stakingOption.chain.id val maximumValidatorsPerNominator = stakingConstantsRepository.maxValidatorsPerNominator(stakingChainId, stake) val recommendationSettings = provider.recommendedSettings(maximumValidatorsPerNominator) - Log.d("PEZ_STAKE", "DirectRecommendation: awaiting recommender...") val recommendator = recommendator.await() - Log.d("PEZ_STAKE", "DirectRecommendation: got recommender, getting recommendations...") val recommendedValidators = recommendator.recommendations(recommendationSettings) - Log.d("PEZ_STAKE", "DirectRecommendation: got ${recommendedValidators.size} recommended validators") return DirectStakingSelection( validators = recommendedValidators, diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/pools/NominationPoolRecommendation.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/pools/NominationPoolRecommendation.kt index b060bc3..fce77ad 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/pools/NominationPoolRecommendation.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/pools/NominationPoolRecommendation.kt @@ -5,7 +5,6 @@ import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.pools. import io.novafoundation.nova.feature_staking_impl.domain.staking.start.common.selection.StartMultiStakingSelection import io.novafoundation.nova.feature_staking_impl.domain.staking.start.setupAmount.SingleStakingRecommendation import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance -import android.util.Log import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async @@ -16,24 +15,11 @@ class NominationPoolRecommendation( ) : SingleStakingRecommendation { private val recommendator = scope.async { - Log.d("PEZ_STAKE", "NomPoolRecommendation: creating recommender...") - try { - val result = nominationPoolRecommenderFactory.create(stakingOption, scope) - Log.d("PEZ_STAKE", "NomPoolRecommendation: recommender created successfully") - result - } catch (e: Exception) { - Log.e("PEZ_STAKE", "NomPoolRecommendation: recommender creation FAILED", e) - throw e - } + nominationPoolRecommenderFactory.create(stakingOption, scope) } override suspend fun recommendedSelection(stake: Balance): StartMultiStakingSelection? { - Log.d("PEZ_STAKE", "NomPoolRecommendation: awaiting recommender...") - val recommendedPool = recommendator.await().recommendedPool() ?: run { - Log.d("PEZ_STAKE", "NomPoolRecommendation: no recommended pool found") - return null - } - Log.d("PEZ_STAKE", "NomPoolRecommendation: recommended pool=${recommendedPool.id}") + val recommendedPool = recommendator.await().recommendedPool() ?: return null return NominationPoolSelection(recommendedPool, stakingOption, stake) } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/selectionType/AutomaticMultiStakingSelectionType.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/selectionType/AutomaticMultiStakingSelectionType.kt index ef64ef0..d9c0b98 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/selectionType/AutomaticMultiStakingSelectionType.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/staking/start/setupAmount/selectionType/AutomaticMultiStakingSelectionType.kt @@ -13,7 +13,6 @@ import io.novafoundation.nova.feature_staking_impl.domain.staking.start.setupAmo import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance import io.novafoundation.nova.feature_wallet_api.data.repository.BalanceLocksRepository import io.novafoundation.nova.feature_wallet_api.domain.model.Asset -import android.util.Log import kotlin.coroutines.cancellation.CancellationException class AutomaticMultiStakingSelectionType( @@ -46,14 +45,8 @@ class AutomaticMultiStakingSelectionType( } override suspend fun updateSelectionFor(stake: Balance) { - Log.d("PEZ_STAKE", "updateSelectionFor: stake=$stake") val stakingProperties = typePropertiesFor(stake) - Log.d("PEZ_STAKE", "updateSelectionFor: got properties type=${stakingProperties.stakingType}") - val candidates = stakingProperties.recommendation.recommendedSelection(stake) ?: run { - Log.d("PEZ_STAKE", "updateSelectionFor: recommendedSelection returned null, returning") - return - } - Log.d("PEZ_STAKE", "updateSelectionFor: got recommended selection") + val candidates = stakingProperties.recommendation.recommendedSelection(stake) ?: return val recommendableSelection = RecommendableMultiStakingSelection( source = SelectionTypeSource.Automatic, @@ -62,25 +55,18 @@ class AutomaticMultiStakingSelectionType( ) selectionStore.updateSelection(recommendableSelection) - Log.d("PEZ_STAKE", "updateSelectionFor: selection updated successfully") } private suspend fun typePropertiesFor(stake: Balance): SingleStakingProperties { - Log.d("PEZ_STAKE", "typePropertiesFor: trying ${candidates.size} candidates") - for ((index, candidate) in candidates.withIndex()) { - Log.d("PEZ_STAKE", "typePropertiesFor: checking candidate $index type=${candidate.stakingType}") + for (candidate in candidates) { try { val minStake = candidate.minStake() - Log.d("PEZ_STAKE", "typePropertiesFor: candidate $index minStake=$minStake, stake=$stake, allows=${minStake <= stake}") if (minStake <= stake) return candidate } catch (e: CancellationException) { - Log.d("PEZ_STAKE", "typePropertiesFor: candidate $index cancelled, rethrowing") throw e - } catch (e: Exception) { - Log.e("PEZ_STAKE", "typePropertiesFor: candidate $index minStake() threw", e) + } catch (_: Exception) { } } - Log.d("PEZ_STAKE", "typePropertiesFor: no candidate allows, finding minimum") return candidates.findWithMinimumStake() } diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/CustomTransactionExtensions.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/CustomTransactionExtensions.kt index 317b2fd..d363ab9 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/CustomTransactionExtensions.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/CustomTransactionExtensions.kt @@ -1,6 +1,5 @@ package io.novafoundation.nova.runtime.extrinsic -import android.util.Log import io.novafoundation.nova.runtime.extrinsic.extensions.AuthorizeCall import io.novafoundation.nova.runtime.extrinsic.extensions.ChargeAssetTxPayment import io.novafoundation.nova.runtime.extrinsic.extensions.CheckAppId @@ -11,8 +10,6 @@ import io.novasama.substrate_sdk_android.runtime.RuntimeSnapshot import io.novasama.substrate_sdk_android.runtime.extrinsic.builder.ExtrinsicBuilder import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtension.TransactionExtension -private const val TAG = "CustomTxExtensions" - object CustomTransactionExtensions { fun applyDefaultValues(builder: ExtrinsicBuilder) { @@ -34,8 +31,6 @@ object CustomTransactionExtensions { val extensions = mutableListOf() val signedExtIds = runtime.metadata.extrinsic.signedExtensions.map { it.id } - Log.d(TAG, "Metadata signed extensions: $signedExtIds") - // Add extensions based on what the metadata requires if ("AuthorizeCall" in signedExtIds) { extensions.add(AuthorizeCall()) @@ -57,7 +52,6 @@ object CustomTransactionExtensions { extensions.add(CheckAppId()) } - Log.d(TAG, "Extensions to add: ${extensions.map { it.name }}") return extensions } } diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/ExtrinsicBuilderFactory.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/ExtrinsicBuilderFactory.kt index 8c628ee..7c6668e 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/ExtrinsicBuilderFactory.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/ExtrinsicBuilderFactory.kt @@ -1,6 +1,5 @@ package io.novafoundation.nova.runtime.extrinsic -import android.util.Log import io.novafoundation.nova.common.utils.orZero import io.novafoundation.nova.runtime.ext.requireGenesisHash import io.novafoundation.nova.runtime.extrinsic.extensions.PezkuwiCheckMortality @@ -20,8 +19,6 @@ import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtensi import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtension.extensions.CheckTxVersion import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtension.extensions.checkMetadataHash.CheckMetadataHash -private const val TAG = "ExtrinsicBuilderFactory" - class ExtrinsicBuilderFactory( private val chainRegistry: ChainRegistry, private val mortalityConstructor: MortalityConstructor, @@ -45,19 +42,10 @@ class ExtrinsicBuilderFactory( ): Sequence { val runtime = chainRegistry.getRuntime(chain.id) - // Log metadata extensions - val metadataExtensions = runtime.metadata.extrinsic.signedExtensions.map { it.id } - Log.d(TAG, "Chain: ${chain.name}, Metadata extensions: $metadataExtensions") - val mortality = mortalityConstructor.constructMortality(chain.id) val metadataProof = metadataShortenerService.generateMetadataProof(chain.id) - // Log custom extensions - val customExtensions = CustomTransactionExtensions.defaultValues(runtime).map { it.name } - Log.d(TAG, "Custom extensions to add: $customExtensions") - val isPezkuwi = isPezkuwiChain(runtime) - Log.d(TAG, "isPezkuwiChain: $isPezkuwi") return generateSequence { ExtrinsicBuilder( @@ -67,7 +55,6 @@ class ExtrinsicBuilderFactory( ).apply { // Use custom CheckMortality for Pezkuwi chains to avoid type lookup issues if (isPezkuwi) { - Log.d(TAG, "Using PezkuwiCheckMortality for ${chain.name}") setTransactionExtension(PezkuwiCheckMortality(mortality.era, mortality.blockHash.fromHex())) } else { setTransactionExtension(CheckMortality(mortality.era, mortality.blockHash.fromHex())) @@ -79,8 +66,6 @@ class ExtrinsicBuilderFactory( setTransactionExtension(CheckTxVersion(metadataProof.usedVersion.transactionVersion)) CustomTransactionExtensions.defaultValues(runtime).forEach(::setTransactionExtension) - - Log.d(TAG, "All extensions set for ${chain.name}") } } } diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/multiNetwork/runtime/RuntimeFactory.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/multiNetwork/runtime/RuntimeFactory.kt index 3b4dd8b..923e018 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/multiNetwork/runtime/RuntimeFactory.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/multiNetwork/runtime/RuntimeFactory.kt @@ -1,6 +1,5 @@ package io.novafoundation.nova.runtime.multiNetwork.runtime -import android.util.Log import com.google.gson.Gson import io.novafoundation.nova.common.utils.md5 import io.novafoundation.nova.common.utils.newLimitedThreadPoolExecutor @@ -79,8 +78,6 @@ class RuntimeFactory( val metadataReader = RuntimeMetadataReader.read(runtimeMetadataRaw) - Log.d("RuntimeFactory", "Constructing metadata of version ${metadataReader.metadataVersion} for chain $chainId") - val schema = metadataReader.metadataPostV14.schema val typePreset = if (metadataReader.metadataVersion < 14) { @@ -93,13 +90,9 @@ class RuntimeFactory( ) } - Log.d("RuntimeFactory", "DEBUG: TypesUsage for chain $chainId = $typesUsage") - val (types, baseHash, ownHash) = when (typesUsage) { TypesUsage.BASE -> { - Log.d("RuntimeFactory", "DEBUG: Loading BASE types for $chainId") val (types, baseHash) = constructBaseTypes(typePreset) - Log.d("RuntimeFactory", "DEBUG: BASE types loaded, hash=$baseHash, typeCount=${types.size}") Triple(types, baseHash, null) } @@ -169,7 +162,6 @@ class RuntimeFactory( val typePreset = try { parseNetworkVersioning(ownTypesTree, withoutVersioning, runtimeVersion) } catch (e: IllegalArgumentException) { - Log.w("RuntimeFactory", "No versioning info in chain types for $chainId, using base definitions") withoutVersioning } @@ -178,12 +170,7 @@ class RuntimeFactory( private suspend fun constructBaseTypes(initialPreset: TypePreset): Pair { val baseTypesRaw = runCatching { runtimeFilesCache.getBaseTypes() } - .getOrElse { - Log.e("RuntimeFactory", "DEBUG: BaseTypes NOT in cache!") - throw BaseTypesNotInCacheException - } - - Log.d("RuntimeFactory", "BaseTypes loaded, len=${baseTypesRaw.length}") + .getOrElse { throw BaseTypesNotInCacheException } val typePreset = parseBaseDefinitions(fromJson(baseTypesRaw), initialPreset) diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/network/updaters/BlockNumberUpdater.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/network/updaters/BlockNumberUpdater.kt index 6aff557..3dcd7b7 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/network/updaters/BlockNumberUpdater.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/network/updaters/BlockNumberUpdater.kt @@ -1,6 +1,5 @@ package io.novafoundation.nova.runtime.network.updaters -import android.util.Log import io.novafoundation.nova.common.utils.Modules import io.novafoundation.nova.common.utils.system import io.novafoundation.nova.core.storage.StorageCache @@ -37,7 +36,6 @@ class BlockNumberUpdater( return storageSubscriptionBuilder.subscribe(storageKey) .onEach { - Log.d("BlockNumberUpdater", "Block number updated: ${it.value}") storageCache.insert(it, scopeValue.id) } .noSideAffects() diff --git a/runtime/src/main/java/io/novafoundation/nova/runtime/util/AccountLookup.kt b/runtime/src/main/java/io/novafoundation/nova/runtime/util/AccountLookup.kt index 4469ea3..66f5338 100644 --- a/runtime/src/main/java/io/novafoundation/nova/runtime/util/AccountLookup.kt +++ b/runtime/src/main/java/io/novafoundation/nova/runtime/util/AccountLookup.kt @@ -1,6 +1,5 @@ package io.novafoundation.nova.runtime.util -import android.util.Log import io.novasama.substrate_sdk_android.runtime.AccountId import io.novasama.substrate_sdk_android.runtime.definitions.types.RuntimeType import io.novasama.substrate_sdk_android.runtime.definitions.types.composite.DictEnum @@ -8,18 +7,14 @@ import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.MULT import io.novasama.substrate_sdk_android.runtime.definitions.types.primitives.FixedByteArray import io.novasama.substrate_sdk_android.runtime.definitions.types.skipAliases -private const val TAG = "AccountLookup" - fun RuntimeType<*, *>.constructAccountLookupInstance(accountId: AccountId): Any { val resolvedType = skipAliases() - Log.d(TAG, "Type name: ${this.name}, resolved type: ${resolvedType?.javaClass?.simpleName}") return when (resolvedType) { is DictEnum -> { // MultiAddress type - wrap in the appropriate variant // Standard chains use "Id", but Pezkuwi uses numeric variants like "0" val variantNames = resolvedType.elements.values.map { it.name } - Log.d(TAG, "DictEnum variants: $variantNames") // Use "Id" if available (standard chains), otherwise use the first variant (index 0) // which is always the AccountId variant in MultiAddress @@ -29,30 +24,22 @@ fun RuntimeType<*, *>.constructAccountLookupInstance(accountId: AccountId): Any // For chains like Pezkuwi that use numeric variant names resolvedType.elements[0]?.name ?: MULTI_ADDRESS_ID } - Log.d(TAG, "Using variant name: $idVariantName") DictEnum.Entry(idVariantName, accountId) } is FixedByteArray -> { // GenericAccountId or similar - return raw accountId - Log.d(TAG, "FixedByteArray type, returning raw accountId") accountId } null -> { // For Pezkuwi chains where alias might not resolve properly - // Check if the original type name suggests MultiAddress - Log.d(TAG, "Resolved type is null, checking original type name: ${this.name}") if (this.name?.contains("MultiAddress") == true || this.name?.contains("multiaddress") == true) { - // For unresolved MultiAddress types, use "0" which is the standard first variant (AccountId) - Log.d(TAG, "Type name contains MultiAddress, using DictEnum.Entry with variant 0") DictEnum.Entry("0", accountId) } else { - Log.d(TAG, "Unknown type with null resolution, returning raw accountId") accountId } } else -> { - // Unknown type - for Pezkuwi compatibility, try raw accountId instead of throwing - Log.w(TAG, "Unknown address type: ${this.name} (${resolvedType.javaClass.simpleName}), trying raw accountId") + // Unknown type - for Pezkuwi compatibility, try raw accountId accountId } }