diff --git a/data/staking/src/main/java/com/tangem/data/staking/converters/ethpool/P2PEthPoolStakingBalanceConverter.kt b/data/staking/src/main/java/com/tangem/data/staking/converters/ethpool/P2PEthPoolStakingBalanceConverter.kt index d04832f6a4..d802603286 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/converters/ethpool/P2PEthPoolStakingBalanceConverter.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/converters/ethpool/P2PEthPoolStakingBalanceConverter.kt @@ -8,29 +8,44 @@ import com.tangem.domain.staking.model.StakingIntegrationID import java.math.BigDecimal /** - * Converts P2PEthPool API response to [StakingBalance]. + * Converts P2PEthPool API responses to [StakingBalance]. * * Uses [P2PEthPoolStakingAccountConverter] for account conversion to avoid duplication. */ internal object P2PEthPoolStakingBalanceConverter { - fun convert(response: P2PEthPoolAccountResponse, source: StatusSource): StakingBalance { + fun convertAll(responses: Set, source: StatusSource): Set { + return responses + .groupBy { it.delegatorAddress } + .map { (delegatorAddress, accountResponses) -> + convert(delegatorAddress, accountResponses, source) + } + .toSet() + } + + private fun convert( + delegatorAddress: String, + responses: List, + source: StatusSource, + ): StakingBalance { val stakingId = StakingID( integrationId = StakingIntegrationID.P2PEthPool.value, - address = response.delegatorAddress, + address = delegatorAddress, ) - val account = P2PEthPoolStakingAccountConverter.convert(response) + val accounts = responses.map { P2PEthPoolStakingAccountConverter.convert(it) } - val hasActivePosition = account.stake.assets > BigDecimal.ZERO || - account.exitQueue.total > BigDecimal.ZERO || - account.availableToWithdraw > BigDecimal.ZERO + val hasActivePosition = accounts.any { account -> + account.stake.assets > BigDecimal.ZERO || + account.exitQueue.total > BigDecimal.ZERO || + account.availableToWithdraw > BigDecimal.ZERO + } return if (hasActivePosition) { StakingBalance.Data.P2PEthPool( stakingId = stakingId, source = source, - account = account, + accounts = accounts, ) } else { StakingBalance.Empty( diff --git a/data/staking/src/main/java/com/tangem/data/staking/store/DefaultP2PEthPoolBalancesStore.kt b/data/staking/src/main/java/com/tangem/data/staking/store/DefaultP2PEthPoolBalancesStore.kt index 35f65f95da..4bb91ccd21 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/store/DefaultP2PEthPoolBalancesStore.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/store/DefaultP2PEthPoolBalancesStore.kt @@ -46,12 +46,10 @@ internal class DefaultP2PEthPoolBalancesStore( runtimeStore.store( value = cachedData.map { (stringWalletId, responses) -> val key = UserWalletId(stringWalletId) - val value = responses.map { response -> - P2PEthPoolStakingBalanceConverter.convert( - response = response, - source = StatusSource.CACHE, - ) - }.toSet() + val value = P2PEthPoolStakingBalanceConverter.convertAll( + responses = responses, + source = StatusSource.CACHE, + ) key to value }.toMap(), @@ -116,12 +114,10 @@ internal class DefaultP2PEthPoolBalancesStore( } private suspend fun storeInRuntime(userWalletId: UserWalletId, values: Set) { - val newBalances = values.map { response -> - P2PEthPoolStakingBalanceConverter.convert( - response = response, - source = StatusSource.ACTUAL, - ) - }.toSet() + val newBalances = P2PEthPoolStakingBalanceConverter.convertAll( + responses = values, + source = StatusSource.ACTUAL, + ) runtimeStore.update(default = emptyMap()) { saved -> saved.toMutableMap().apply { diff --git a/data/staking/src/test/kotlin/com/tangem/data/staking/StakingBalanceExt.kt b/data/staking/src/test/kotlin/com/tangem/data/staking/StakingBalanceExt.kt index aec8fadd1f..0b2a63f262 100644 --- a/data/staking/src/test/kotlin/com/tangem/data/staking/StakingBalanceExt.kt +++ b/data/staking/src/test/kotlin/com/tangem/data/staking/StakingBalanceExt.kt @@ -14,8 +14,8 @@ internal fun YieldBalanceWrapperDTO.toDomain(source: StatusSource = StatusSource internal fun P2PEthPoolAccountResponse.toDomain( source: StatusSource = StatusSource.CACHE, ): StakingBalance { - return P2PEthPoolStakingBalanceConverter.convert( - response = this, + return P2PEthPoolStakingBalanceConverter.convertAll( + responses = setOf(this), source = source, - ) + ).first() } \ No newline at end of file diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/staking/StakingBalance.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/staking/StakingBalance.kt index 3e852db2fa..11c22e2ae4 100644 --- a/domain/models/src/main/kotlin/com/tangem/domain/models/staking/StakingBalance.kt +++ b/domain/models/src/main/kotlin/com/tangem/domain/models/staking/StakingBalance.kt @@ -55,18 +55,18 @@ sealed interface StakingBalance { data class P2PEthPool( override val stakingId: StakingID, override val source: StatusSource, - val account: P2PEthPoolStakingAccount, + val accounts: List, ) : Data { - override val totalStaked: SerializedBigDecimal = account.stake.assets + override val totalStaked: SerializedBigDecimal = accounts.sumOf { it.stake.assets } - override val totalRewards: SerializedBigDecimal = account.stake.totalEarnedAssets + override val totalRewards: SerializedBigDecimal = accounts.sumOf { it.stake.totalEarnedAssets } - override val unstakingAmount: SerializedBigDecimal = account.exitQueue.total + override val unstakingAmount: SerializedBigDecimal = accounts.sumOf { it.exitQueue.total } - override val withdrawableAmount: SerializedBigDecimal = account.availableToWithdraw + override val withdrawableAmount: SerializedBigDecimal = accounts.sumOf { it.availableToWithdraw } - override val entries: List = account.toStakingBalanceEntries() + override val entries: List = accounts.flatMap { it.toStakingBalanceEntries() } } }