From 1fac88b573cf3fa0294487db4afe8f6324237dcd Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Wed, 11 Feb 2026 12:07:51 +0300 Subject: [PATCH] revert: restore original Nova staking code Removed custom staking modifications - use Nova's original implementation. Chain config (A+B=C) handles Polkadot 2.0 correctly via timelineChain. --- .../updaters/StakingDashboardUpdateSystem.kt | 4 +-- .../di/StakingFeatureModule.kt | 9 ++--- .../nominationPool/NominationPoolModule.kt | 6 ++-- .../domain/common/EraCalculatorFactory.kt | 8 ++--- .../domain/common/StakingSharedComputation.kt | 26 +++++--------- .../domain/nominationPools/ChainExt.kt | 35 +------------------ .../RealNominationPoolRewardCalculator.kt | 6 +--- .../alerts/NominationPoolsAlertsInteractor.kt | 5 +-- .../NominationPoolsNetworkInfoInteractor.kt | 18 ++-------- .../NominationPoolStakeSummaryInteractor.kt | 6 +--- .../domain/rewards/RewardCalculatorFactory.kt | 33 ++++------------- .../main/StakingDashboardViewModel.kt | 8 +---- version.properties | 2 +- 13 files changed, 35 insertions(+), 131 deletions(-) diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/dashboard/network/updaters/StakingDashboardUpdateSystem.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/dashboard/network/updaters/StakingDashboardUpdateSystem.kt index 0ca037f..8ba1cce 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/dashboard/network/updaters/StakingDashboardUpdateSystem.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/data/dashboard/network/updaters/StakingDashboardUpdateSystem.kt @@ -90,8 +90,8 @@ class RealStakingDashboardUpdateSystem( sharedRequestsBuilder.subscribe(accountScope) chainUpdates.mergeIfMultiple() - }.catch { e -> - Log.e("StakingDashboardUpdateSystem", "Failed to sync staking dashboard status for ${stakingChain.name}", e) + }.catch { + Log.d("StakingDashboardUpdateSystem", "Failed to sync staking dashboard status for ${stakingChain.name}") } } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureModule.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureModule.kt index c8f0a13..d025836 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureModule.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureModule.kt @@ -212,8 +212,7 @@ class StakingFeatureModule { bagListRepository: BagListRepository, totalIssuanceRepository: TotalIssuanceRepository, eraTimeCalculatorFactory: EraTimeCalculatorFactory, - stakingConstantsRepository: StakingConstantsRepository, - chainRegistry: ChainRegistry + stakingConstantsRepository: StakingConstantsRepository ) = StakingSharedComputation( stakingRepository = stakingRepository, computationalCache = computationalCache, @@ -222,8 +221,7 @@ class StakingFeatureModule { bagListRepository = bagListRepository, totalIssuanceRepository = totalIssuanceRepository, eraTimeCalculatorFactory = eraTimeCalculatorFactory, - stakingConstantsRepository = stakingConstantsRepository, - chainRegistry = chainRegistry + stakingConstantsRepository = stakingConstantsRepository ) @Provides @@ -299,8 +297,7 @@ class StakingFeatureModule { sessionRepository: SessionRepository, chainStateRepository: ChainStateRepository, electionsSessionRegistry: ElectionsSessionRegistry, - chainRegistry: ChainRegistry, - ) = EraTimeCalculatorFactory(stakingRepository, sessionRepository, chainStateRepository, electionsSessionRegistry, chainRegistry) + ) = EraTimeCalculatorFactory(stakingRepository, sessionRepository, chainStateRepository, electionsSessionRegistry) @Provides @FeatureScope diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/staking/nominationPool/NominationPoolModule.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/staking/nominationPool/NominationPoolModule.kt index 7b75c0f..36fec3c 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/staking/nominationPool/NominationPoolModule.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/staking/nominationPool/NominationPoolModule.kt @@ -56,9 +56,9 @@ import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.pools. import io.novafoundation.nova.feature_staking_impl.presentation.nominationPools.common.PoolDisplayFormatter import io.novafoundation.nova.feature_staking_impl.presentation.nominationPools.common.RealPoolDisplayFormatter import io.novafoundation.nova.runtime.call.MultiChainRuntimeCallsApi -import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry import io.novafoundation.nova.runtime.di.LOCAL_STORAGE_SOURCE import io.novafoundation.nova.runtime.di.REMOTE_STORAGE_SOURCE +import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry import io.novafoundation.nova.runtime.storage.source.StorageDataSource import javax.inject.Named @@ -151,14 +151,12 @@ class NominationPoolModule { poolAccountDerivation: PoolAccountDerivation, relaychainStakingInteractor: StakingInteractor, nominationPoolMemberUseCase: NominationPoolMemberUseCase, - chainRegistry: ChainRegistry, ): NominationPoolsNetworkInfoInteractor = RealNominationPoolsNetworkInfoInteractor( relaychainStakingSharedComputation = relaychainStakingSharedComputation, nominationPoolGlobalsRepository = nominationPoolGlobalsRepository, poolAccountDerivation = poolAccountDerivation, relaychainStakingInteractor = relaychainStakingInteractor, - nominationPoolMemberUseCase = nominationPoolMemberUseCase, - chainRegistry = chainRegistry + nominationPoolMemberUseCase = nominationPoolMemberUseCase ) @Provides diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/EraCalculatorFactory.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/EraCalculatorFactory.kt index 50bafb2..3f6737f 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/EraCalculatorFactory.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/EraCalculatorFactory.kt @@ -9,7 +9,6 @@ import io.novafoundation.nova.feature_staking_impl.data.chain import io.novafoundation.nova.feature_staking_impl.data.repository.SessionRepository import io.novafoundation.nova.feature_staking_impl.data.repository.consensus.ElectionsSessionRegistry import io.novafoundation.nova.runtime.ext.timelineChainIdOrSelf -import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry import io.novafoundation.nova.runtime.repository.ChainStateRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine @@ -97,7 +96,6 @@ class EraTimeCalculatorFactory( private val sessionRepository: SessionRepository, private val chainStateRepository: ChainStateRepository, private val electionsSessionRegistry: ElectionsSessionRegistry, - private val chainRegistry: ChainRegistry, ) { suspend fun create( @@ -105,8 +103,8 @@ class EraTimeCalculatorFactory( activeEraFlow: Flow ): Flow { val stakingChain = stakingOption.chain + val stakingChainId = stakingChain.id val timelineChainId = stakingChain.timelineChainIdOrSelf() - val timelineChain = chainRegistry.getChain(timelineChainId) val electionsSession = electionsSessionRegistry.electionsSessionFor(stakingOption) @@ -114,7 +112,7 @@ class EraTimeCalculatorFactory( val sessionLength = electionsSession.sessionLength(timelineChainId) val eraAndStartSessionIndex = activeEraFlow.map { activeEra -> - val eraStartSessionIndex = stakingRepository.eraStartSessionIndex(timelineChainId, activeEra) + val eraStartSessionIndex = stakingRepository.eraStartSessionIndex(stakingChainId, activeEra) activeEra to eraStartSessionIndex } @@ -126,7 +124,7 @@ class EraTimeCalculatorFactory( ) { (activeEra, eraStartSessionIndex), currentSessionIndex, currentEpochIndex, currentSlot -> EraTimeCalculator( startTimeStamp = System.currentTimeMillis().toBigInteger(), - eraLength = stakingRepository.eraLength(timelineChain), + eraLength = stakingRepository.eraLength(stakingChain), blockCreationTime = chainStateRepository.predictedBlockTime(timelineChainId), currentSessionIndex = currentSessionIndex, currentEpochIndex = currentEpochIndex ?: currentSessionIndex, diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/StakingSharedComputation.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/StakingSharedComputation.kt index 149f9fd..d17ad39 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/StakingSharedComputation.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/common/StakingSharedComputation.kt @@ -18,8 +18,6 @@ import io.novafoundation.nova.feature_staking_impl.domain.minimumStake import io.novafoundation.nova.feature_staking_impl.domain.rewards.RewardCalculator import io.novafoundation.nova.feature_staking_impl.domain.rewards.RewardCalculatorFactory import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance -import io.novafoundation.nova.runtime.ext.timelineChainIdOrSelf -import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry import io.novafoundation.nova.runtime.multiNetwork.ChainWithAsset import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId @@ -45,18 +43,15 @@ class StakingSharedComputation( private val bagListRepository: BagListRepository, private val totalIssuanceRepository: TotalIssuanceRepository, private val eraTimeCalculatorFactory: EraTimeCalculatorFactory, - private val stakingConstantsRepository: StakingConstantsRepository, - private val chainRegistry: ChainRegistry + private val stakingConstantsRepository: StakingConstantsRepository ) { fun eraCalculatorFlow(stakingOption: StakingOption, scope: CoroutineScope): Flow { - val chain = stakingOption.assetWithChain.chain - val chainId = chain.id - val timelineChainId = chain.timelineChainIdOrSelf() + val chainId = stakingOption.assetWithChain.chain.id val key = "ERA_TIME_CALCULATOR:$chainId" return computationalCache.useSharedFlow(key, scope) { - val activeEraFlow = activeEraFlow(timelineChainId, scope) + val activeEraFlow = activeEraFlow(chainId, scope) eraTimeCalculatorFactory.create(stakingOption, activeEraFlow) } @@ -84,17 +79,14 @@ class StakingSharedComputation( val key = "MIN_STAKE:$chainId" return computationalCache.useSharedFlow(key, scope) { - val chain = chainRegistry.getChain(chainId) - val timelineChainId = chain.timelineChainIdOrSelf() - - val minBond = stakingRepository.minimumNominatorBond(timelineChainId) - val bagListLocator = bagListRepository.bagListLocatorOrNull(timelineChainId) - val totalIssuance = totalIssuanceRepository.getTotalIssuance(timelineChainId) + val minBond = stakingRepository.minimumNominatorBond(chainId) + val bagListLocator = bagListRepository.bagListLocatorOrNull(chainId) + val totalIssuance = totalIssuanceRepository.getTotalIssuance(chainId) val bagListScoreConverter = BagListScoreConverter.U128(totalIssuance) - val maxElectingVoters = bagListRepository.maxElectingVotes(timelineChainId) - val bagListSize = bagListRepository.bagListSize(timelineChainId) + val maxElectingVoters = bagListRepository.maxElectingVotes(chainId) + val bagListSize = bagListRepository.bagListSize(chainId) - electedExposuresWithActiveEraFlow(timelineChainId, scope).map { (exposures, activeEraIndex) -> + electedExposuresWithActiveEraFlow(chainId, scope).map { (exposures, activeEraIndex) -> val minStake = minimumStake( exposures = exposures.values, minimumNominatorBond = minBond, diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/ChainExt.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/ChainExt.kt index 5a19e5e..785f2df 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/ChainExt.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/ChainExt.kt @@ -1,40 +1,7 @@ package io.novafoundation.nova.feature_staking_impl.domain.nominationPools import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain -import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId -/** - * Finds the staking type that backs nomination pools. - * - * In Polkadot 1.0: Both relaychain and nomination-pools exist on the same chain - * In Polkadot 2.0: nomination-pools may exist on Asset Hub without local backing type - * (backing is via XCM from relay chain) - * - * @return The backing staking type, or RELAYCHAIN as default for Polkadot 2.0 compatibility - */ fun Chain.Asset.findStakingTypeBackingNominationPools(): Chain.Asset.StakingType { - return staking.firstOrNull { it != Chain.Asset.StakingType.NOMINATION_POOLS } - ?: Chain.Asset.StakingType.RELAYCHAIN // Polkadot 2.0: default to RELAYCHAIN for Asset Hub -} - -/** - * Checks if this asset has nomination pools backed by a local staking type. - * Returns false for Polkadot 2.0 Asset Hub where backing is cross-chain. - */ -fun Chain.Asset.hasLocalNominationPoolsBacking(): Boolean { - return staking.any { it != Chain.Asset.StakingType.NOMINATION_POOLS } -} - -/** - * Returns the chain ID where staking exposures (validators, eras) live. - * - * For nomination pools on a parachain (e.g. Asset Hub in Polkadot 2.0), - * the staking ledger/exposures are on the parent relay chain. - * For relay chains or chains with local staking, returns the chain's own ID. - */ -fun Chain.stakingBackingChainId(stakingType: Chain.Asset.StakingType): ChainId { - if (stakingType == Chain.Asset.StakingType.NOMINATION_POOLS && parentId != null) { - return parentId!! - } - return id + return staking.first { it != Chain.Asset.StakingType.NOMINATION_POOLS } } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/common/rewards/RealNominationPoolRewardCalculator.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/common/rewards/RealNominationPoolRewardCalculator.kt index fc9b047..4cec59f 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/common/rewards/RealNominationPoolRewardCalculator.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/common/rewards/RealNominationPoolRewardCalculator.kt @@ -13,11 +13,9 @@ import io.novafoundation.nova.feature_account_api.data.model.AccountIdMap import io.novafoundation.nova.feature_staking_api.domain.model.Exposure import io.novafoundation.nova.feature_staking_impl.data.StakingOption import io.novafoundation.nova.feature_staking_impl.data.chain -import io.novafoundation.nova.feature_staking_impl.data.stakingType import io.novafoundation.nova.feature_staking_api.domain.nominationPool.model.PoolId import io.novafoundation.nova.feature_staking_impl.data.unwrapNominationPools import io.novafoundation.nova.feature_staking_impl.domain.common.StakingSharedComputation -import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.stakingBackingChainId import io.novafoundation.nova.feature_staking_impl.domain.common.electedExposuresInActiveEra import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.common.NominationPoolSharedComputation import io.novafoundation.nova.feature_staking_impl.domain.rewards.RewardCalculator @@ -30,8 +28,6 @@ class NominationPoolRewardCalculatorFactory( suspend fun create(stakingOption: StakingOption, sharedComputationScope: CoroutineScope): NominationPoolRewardCalculator { val chainId = stakingOption.chain.id - // For nomination pools on parachains (like Asset Hub), get exposures from parent relay chain - val stakingBackingChainId = stakingOption.chain.stakingBackingChainId(stakingOption.stakingType) val delegateOption = stakingOption.unwrapNominationPools() @@ -42,7 +38,7 @@ class NominationPoolRewardCalculatorFactory( return RealNominationPoolRewardCalculator( directStakingDelegate = delegate, - exposures = sharedStakingSharedComputation.electedExposuresInActiveEra(stakingBackingChainId, sharedComputationScope), + exposures = sharedStakingSharedComputation.electedExposuresInActiveEra(stakingOption.assetWithChain.chain.id, sharedComputationScope), commissions = poolCommissions, poolStashesById = allPoolAccounts ) diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/alerts/NominationPoolsAlertsInteractor.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/alerts/NominationPoolsAlertsInteractor.kt index 544c5be..7c7e07d 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/alerts/NominationPoolsAlertsInteractor.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/alerts/NominationPoolsAlertsInteractor.kt @@ -18,7 +18,6 @@ import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.common import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.main.alerts.NominationPoolAlert.RedeemTokens import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.main.alerts.NominationPoolAlert.WaitingForNextEra import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.main.alerts.RealNominationPoolsAlertsInteractor.AlertsResolutionContext.PoolContext -import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.stakingBackingChainId import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain import io.novasama.substrate_sdk_android.hash.isPositive import io.novasama.substrate_sdk_android.runtime.AccountId @@ -50,13 +49,11 @@ class RealNominationPoolsAlertsInteractor( return flowOfAll { val poolId = poolMember.poolId val poolStash = poolAccountDerivation.bondedAccountOf(poolId, chain.id) - // For nomination pools on parachains (like Asset Hub), get exposures from parent relay chain - val stakingBackingChainId = chain.stakingBackingChainId(Chain.Asset.StakingType.NOMINATION_POOLS) combine( nominationPoolsSharedComputation.participatingPoolNominationsFlow(poolStash, poolId, chain.id, shareComputationScope), nominationPoolsSharedComputation.unbondingPoolsFlow(poolId, chain.id, shareComputationScope), - stakingSharedComputation.electedExposuresWithActiveEraFlow(stakingBackingChainId, shareComputationScope), + stakingSharedComputation.electedExposuresWithActiveEraFlow(chain.id, shareComputationScope), ) { poolNominations, unbondingPools, (eraStakers, activeEra) -> val alertsContext = AlertsResolutionContext( eraStakers = eraStakers, diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/networkInfo/NominationPoolsNetworkInfoInteractor.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/networkInfo/NominationPoolsNetworkInfoInteractor.kt index 9d937e1..e86730a 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/networkInfo/NominationPoolsNetworkInfoInteractor.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/networkInfo/NominationPoolsNetworkInfoInteractor.kt @@ -12,9 +12,6 @@ import io.novafoundation.nova.feature_staking_impl.domain.StakingInteractor import io.novafoundation.nova.feature_staking_impl.domain.common.StakingSharedComputation import io.novafoundation.nova.feature_staking_impl.domain.common.electedExposuresInActiveEraFlow import io.novafoundation.nova.feature_staking_impl.domain.model.NetworkInfo -import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.stakingBackingChainId -import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry -import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain import io.novafoundation.nova.feature_staking_impl.domain.model.StakingPeriod import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.common.NominationPoolMemberUseCase import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance @@ -22,8 +19,6 @@ import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.emitAll -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import java.math.BigInteger @@ -40,7 +35,6 @@ class RealNominationPoolsNetworkInfoInteractor( private val poolAccountDerivation: PoolAccountDerivation, private val relaychainStakingInteractor: StakingInteractor, private val nominationPoolMemberUseCase: NominationPoolMemberUseCase, - private val chainRegistry: ChainRegistry, ) : NominationPoolsNetworkInfoInteractor { override fun observeShouldShowNetworkInfo(): Flow { @@ -50,13 +44,9 @@ class RealNominationPoolsNetworkInfoInteractor( override fun observeNetworkInfo( chainId: ChainId, sharedComputationScope: CoroutineScope - ): Flow = flow { - // For nomination pools on parachains (like Asset Hub), get exposures from parent relay chain - val chain = chainRegistry.getChain(chainId) - val stakingBackingChainId = chain.stakingBackingChainId(Chain.Asset.StakingType.NOMINATION_POOLS) - - val networkInfoFlow = combine( - relaychainStakingSharedComputation.electedExposuresInActiveEraFlow(stakingBackingChainId, sharedComputationScope), + ): Flow { + return combine( + relaychainStakingSharedComputation.electedExposuresInActiveEraFlow(chainId, sharedComputationScope), nominationPoolGlobalsRepository.observeMinJoinBond(chainId), nominationPoolGlobalsRepository.lastPoolIdFlow(chainId), lockupDurationFlow(sharedComputationScope), @@ -69,8 +59,6 @@ class RealNominationPoolsNetworkInfoInteractor( nominatorsCount = null ) } - - emitAll(networkInfoFlow) } private fun lockupDurationFlow(sharedComputationScope: CoroutineScope) = flowOf { relaychainStakingInteractor.getLockupDuration(sharedComputationScope) } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/stakeSummary/NominationPoolStakeSummaryInteractor.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/stakeSummary/NominationPoolStakeSummaryInteractor.kt index 223684a..e5a3f73 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/stakeSummary/NominationPoolStakeSummaryInteractor.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/nominationPools/main/stakeSummary/NominationPoolStakeSummaryInteractor.kt @@ -9,10 +9,8 @@ import io.novafoundation.nova.feature_staking_api.domain.model.EraIndex import io.novafoundation.nova.feature_staking_api.domain.model.Exposure import io.novafoundation.nova.feature_staking_api.domain.model.Nominations import io.novafoundation.nova.feature_staking_impl.data.StakingOption -import io.novafoundation.nova.feature_staking_impl.data.stakingType import io.novafoundation.nova.feature_staking_impl.data.nominationPools.network.blockhain.models.PoolMember import io.novafoundation.nova.feature_staking_impl.domain.common.StakingSharedComputation -import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.stakingBackingChainId import io.novafoundation.nova.feature_staking_impl.domain.common.isWaiting import io.novafoundation.nova.feature_staking_impl.domain.model.StakeSummary import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.common.NominationPoolSharedComputation @@ -50,14 +48,12 @@ class RealNominationPoolStakeSummaryInteractor( sharedComputationScope: CoroutineScope, ): Flow> = flowOfAll { val chainId = stakingOption.assetWithChain.chain.id - // For nomination pools on parachains (like Asset Hub), get exposures from parent relay chain - val stakingBackingChainId = stakingOption.assetWithChain.chain.stakingBackingChainId(stakingOption.stakingType) val poolStash = poolAccountDerivation.bondedAccountOf(poolMember.poolId, chainId) combineTransform( nominationPoolSharedComputation.participatingBondedPoolStateFlow(poolStash, poolMember.poolId, chainId, sharedComputationScope), nominationPoolSharedComputation.participatingPoolNominationsFlow(poolStash, poolMember.poolId, chainId, sharedComputationScope), - stakingSharedComputation.electedExposuresWithActiveEraFlow(stakingBackingChainId, sharedComputationScope) + stakingSharedComputation.electedExposuresWithActiveEraFlow(chainId, sharedComputationScope) ) { bondedPoolState, poolNominations, (eraStakers, activeEra) -> val activeStaked = bondedPoolState.amountOf(poolMember.points) diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/rewards/RewardCalculatorFactory.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/rewards/RewardCalculatorFactory.kt index c3302ab..997761a 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/rewards/RewardCalculatorFactory.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/domain/rewards/RewardCalculatorFactory.kt @@ -13,7 +13,6 @@ import io.novafoundation.nova.feature_staking_impl.data.repository.VaraRepositor import io.novafoundation.nova.feature_staking_impl.data.stakingType import io.novafoundation.nova.feature_staking_impl.data.unwrapNominationPools import io.novafoundation.nova.feature_staking_impl.domain.common.StakingSharedComputation -import io.novafoundation.nova.feature_staking_impl.domain.nominationPools.stakingBackingChainId import io.novafoundation.nova.feature_staking_impl.domain.common.electedExposuresInActiveEra import io.novafoundation.nova.feature_staking_impl.domain.common.eraTimeCalculator import io.novafoundation.nova.feature_staking_impl.domain.error.accountIdNotFound @@ -28,7 +27,6 @@ import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain.Asset.Staki import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain.Asset.StakingType.TURING import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain.Asset.StakingType.UNSUPPORTED import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId -import io.novafoundation.nova.runtime.ext.timelineChainIdOrSelf import io.novafoundation.nova.runtime.repository.TotalIssuanceRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -49,10 +47,7 @@ class RewardCalculatorFactory( validatorsPrefs: AccountIdMap, scope: CoroutineScope ): RewardCalculator = withContext(Dispatchers.Default) { - val timelineChainId = stakingOption.assetWithChain.chain.timelineChainIdOrSelf() - val totalIssuance = totalIssuanceRepository.getTotalIssuance(timelineChainId) - - Log.d("RewardCalculatorFactory", "totalIssuance for $timelineChainId: $totalIssuance") + val totalIssuance = totalIssuanceRepository.getTotalIssuance(stakingOption.assetWithChain.chain.id) val validators = exposures.keys.mapNotNull { accountIdHex -> val exposure = exposures[accountIdHex] ?: accountIdNotFound(accountIdHex) @@ -65,22 +60,14 @@ class RewardCalculatorFactory( ) } - Log.d("RewardCalculatorFactory", "Validators count for reward calculation: ${validators.size}") - if (validators.isNotEmpty()) { - val totalStaked = validators.sumOf { it.totalStake } - Log.d("RewardCalculatorFactory", "Total staked: $totalStaked, stakedPortion: ${totalStaked.toDouble() / totalIssuance.toDouble()}") - } - stakingOption.createRewardCalculator(validators, totalIssuance, scope) } suspend fun create(stakingOption: StakingOption, scope: CoroutineScope): RewardCalculator = withContext(Dispatchers.Default) { - val chain = stakingOption.assetWithChain.chain - // For nomination pools on parachains (like Asset Hub), get exposures from parent relay chain - val stakingBackingChainId = chain.stakingBackingChainId(stakingOption.stakingType) + val chainId = stakingOption.assetWithChain.chain.id - val exposures = shareStakingSharedComputation.get().electedExposuresInActiveEra(stakingBackingChainId, scope) - val validatorsPrefs = stakingRepository.getValidatorPrefs(stakingBackingChainId, exposures.keys) + val exposures = shareStakingSharedComputation.get().electedExposuresInActiveEra(chainId, scope) + val validatorsPrefs = stakingRepository.getValidatorPrefs(chainId, exposures.keys) create(stakingOption, exposures, validatorsPrefs, scope) } @@ -95,16 +82,10 @@ class RewardCalculatorFactory( val custom = customRelayChainCalculator(validators, totalIssuance, scope) if (custom != null) return custom - val timelineChainId = chain.timelineChainIdOrSelf() - val activePublicParachains = parasRepository.activePublicParachains(timelineChainId) - Log.d("RewardCalculatorFactory", "activePublicParachains for $timelineChainId: $activePublicParachains") + val activePublicParachains = parasRepository.activePublicParachains(assetWithChain.chain.id) + val inflationConfig = InflationConfig.create(chain.id, activePublicParachains) - val inflationConfig = InflationConfig.create(timelineChainId, activePublicParachains) - Log.d("RewardCalculatorFactory", "Using Default InflationConfig for $timelineChainId") - - val calculator = RewardCurveInflationRewardCalculator(validators, totalIssuance, inflationConfig) - Log.d("RewardCalculatorFactory", "expectedAPY: ${calculator.expectedAPY}, maxAPY: ${calculator.maxAPY}") - calculator + RewardCurveInflationRewardCalculator(validators, totalIssuance, inflationConfig) } ALEPH_ZERO -> AlephZeroRewardCalculator(validators, chainAsset = assetWithChain.asset) diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/main/StakingDashboardViewModel.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/main/StakingDashboardViewModel.kt index 08d9260..4523ac3 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/main/StakingDashboardViewModel.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/main/StakingDashboardViewModel.kt @@ -102,13 +102,7 @@ class StakingDashboardViewModel( fun onNoStakeItemClicked(index: Int) = launch { val withoutStakeItems = stakingDashboardFlow.firstLoaded().withoutStake val withoutStakeItem = withoutStakeItems.getOrNull(index) ?: return@launch - val noStakeItemState = withoutStakeItem.stakingState as? NoStake - - if (noStakeItemState == null) { - // Item is still syncing (NotYetResolved state) - showToast(resourceManager.getString(R.string.staking_dashboard_syncing)) - return@launch - } + val noStakeItemState = withoutStakeItem.stakingState as? NoStake ?: return@launch val stakingTypes = noStakeItemState.flowType.allStakingTypes val chain = withoutStakeItem.chain diff --git a/version.properties b/version.properties index 4517436..027a7e9 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -VERSION_CODE=163 \ No newline at end of file +VERSION_CODE=166 \ No newline at end of file