From cb23c1dea37dd9769a9aff8ef949f36a595c677c Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 21 Apr 2025 15:03:17 +0300 Subject: [PATCH] Updated on 2026-08-14 --- common/test/build.gradle.kts | 1 + .../MockYieldBalanceWrapperDTOFactory.kt | 2 +- .../local/token/DefaultStakingYieldsStore.kt | 11 +++++++++++ .../local/token/StakingYieldsStore.kt | 2 ++ .../single/DefaultSingleYieldBalanceProducer.kt | 2 +- .../staking/store/DefaultYieldsBalancesStore.kt | 2 +- .../data/staking/store/YieldsBalancesStore.kt | 3 +-- .../data/staking/utils/StakingIdFactory.kt | 17 +++++++++++++++-- .../DefaultMultiYieldBalanceProducerTest.kt | 3 ++- .../DefaultSingleYieldBalanceProducerTest.kt | 4 ++-- .../YieldsBalancesStoreUpdateMethodsTest.kt | 3 ++- .../tangem/domain/staking/model/StakingID.kt | 4 ++++ 12 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/StakingID.kt diff --git a/common/test/build.gradle.kts b/common/test/build.gradle.kts index f2de491c8c..62d076fdff 100644 --- a/common/test/build.gradle.kts +++ b/common/test/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation(projects.domain.legacy) implementation(projects.domain.models) + implementation(projects.domain.staking.models) implementation(projects.domain.tokens.models) implementation(projects.domain.wallets) implementation(projects.domain.wallets.models) diff --git a/common/test/src/main/java/com/tangem/common/test/data/staking/MockYieldBalanceWrapperDTOFactory.kt b/common/test/src/main/java/com/tangem/common/test/data/staking/MockYieldBalanceWrapperDTOFactory.kt index 71ad65f3d2..1616a4c847 100644 --- a/common/test/src/main/java/com/tangem/common/test/data/staking/MockYieldBalanceWrapperDTOFactory.kt +++ b/common/test/src/main/java/com/tangem/common/test/data/staking/MockYieldBalanceWrapperDTOFactory.kt @@ -1,11 +1,11 @@ package com.tangem.common.test.data.staking -import com.tangem.data.staking.store.YieldsBalancesStore.StakingID import com.tangem.datasource.api.stakekit.models.request.Address import com.tangem.datasource.api.stakekit.models.response.model.BalanceDTO import com.tangem.datasource.api.stakekit.models.response.model.NetworkTypeDTO import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO +import com.tangem.domain.staking.model.StakingID import java.math.BigDecimal /** diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt index 874e884f87..73800ea6dd 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt @@ -4,6 +4,8 @@ import androidx.datastore.core.DataStore import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.withTimeoutOrNull +import kotlin.time.Duration.Companion.seconds internal class DefaultStakingYieldsStore( private val dataStore: DataStore>, @@ -17,9 +19,18 @@ internal class DefaultStakingYieldsStore( return dataStore.data.firstOrNull().orEmpty() } + override suspend fun getSyncWithTimeout(): List? { + return withTimeoutOrNull(timeout = YIELDS_WAITING_TIMEOUT, block = { get().firstOrNull() }) + } + override suspend fun store(items: List) { dataStore.updateData { _ -> items } } + + private companion object { + + val YIELDS_WAITING_TIMEOUT = 15.seconds + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/token/StakingYieldsStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/token/StakingYieldsStore.kt index 428aa1986c..29d2e37b01 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/token/StakingYieldsStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/token/StakingYieldsStore.kt @@ -9,5 +9,7 @@ interface StakingYieldsStore { suspend fun getSync(): List + suspend fun getSyncWithTimeout(): List? + suspend fun store(items: List) } \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt b/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt index 3327ef9790..e2bb5cc604 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducer.kt @@ -1,7 +1,7 @@ package com.tangem.data.staking.single -import com.tangem.data.staking.store.YieldsBalancesStore.StakingID import com.tangem.data.staking.utils.StakingIdFactory +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.staking.multi.MultiYieldBalanceProducer import com.tangem.domain.staking.multi.MultiYieldBalanceSupplier diff --git a/data/staking/src/main/java/com/tangem/data/staking/store/DefaultYieldsBalancesStore.kt b/data/staking/src/main/java/com/tangem/data/staking/store/DefaultYieldsBalancesStore.kt index 32beb14ec3..c3a8b2a74c 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/store/DefaultYieldsBalancesStore.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/store/DefaultYieldsBalancesStore.kt @@ -1,11 +1,11 @@ package com.tangem.data.staking.store import androidx.datastore.core.DataStore -import com.tangem.data.staking.store.YieldsBalancesStore.StakingID import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO import com.tangem.datasource.local.datastore.RuntimeSharedStore import com.tangem.datasource.local.token.converter.YieldBalanceConverter import com.tangem.domain.models.StatusSource +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.wallets.models.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider diff --git a/data/staking/src/main/java/com/tangem/data/staking/store/YieldsBalancesStore.kt b/data/staking/src/main/java/com/tangem/data/staking/store/YieldsBalancesStore.kt index 2e5c062f3d..3371d07f1c 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/store/YieldsBalancesStore.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/store/YieldsBalancesStore.kt @@ -1,6 +1,7 @@ package com.tangem.data.staking.store import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.flow.Flow @@ -26,6 +27,4 @@ interface YieldsBalancesStore { /** Store error by [userWalletId] and [stakingId] */ suspend fun storeError(userWalletId: UserWalletId, stakingId: StakingID) - - data class StakingID(val integrationId: String, val address: String) } \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/utils/StakingIdFactory.kt b/data/staking/src/main/java/com/tangem/data/staking/utils/StakingIdFactory.kt index 7e8362efb5..9caf2f53fe 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/utils/StakingIdFactory.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/utils/StakingIdFactory.kt @@ -3,7 +3,7 @@ package com.tangem.data.staking.utils import com.tangem.blockchain.common.Blockchain import com.tangem.blockchainsdk.utils.toCoinId import com.tangem.blockchainsdk.utils.toMigratedCoinId -import com.tangem.data.staking.store.YieldsBalancesStore.StakingID +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.domain.walletmanager.WalletManagersFacade @@ -31,12 +31,25 @@ internal class StakingIdFactory @Inject constructor( } } + suspend fun createForDefault( + userWalletId: UserWalletId, + currencyId: CryptoCurrency.ID, + network: Network, + ): StakingID? { + val address = walletManagersFacade.getDefaultAddress(userWalletId = userWalletId, network = network) + val integrationId = createIntegrationId(currencyId) + + if (address == null || integrationId == null) return null + + return StakingID(integrationId = integrationId, address = address) + } + fun createIntegrationId(currencyId: CryptoCurrency.ID): String? { val integrationKey = with(currencyId) { rawNetworkId.plus(rawCurrencyId) } return integrationIdMap[integrationKey] } - @Suppress("UnusedPrivateMember") + @Suppress("UnusedPrivateMember", "unused") companion object { private const val TON_INTEGRATION_ID = "ton-ton-chorus-one-pools-staking" diff --git a/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceProducerTest.kt b/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceProducerTest.kt index a545c87d92..d558475162 100644 --- a/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceProducerTest.kt +++ b/data/staking/src/test/kotlin/com/tangem/data/staking/multi/DefaultMultiYieldBalanceProducerTest.kt @@ -5,6 +5,7 @@ import com.tangem.common.test.data.staking.MockYieldBalanceWrapperDTOFactory import com.tangem.common.test.utils.getEmittedValues import com.tangem.data.staking.store.YieldsBalancesStore import com.tangem.data.staking.toDomain +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.staking.multi.MultiYieldBalanceProducer import com.tangem.domain.wallets.models.UserWalletId @@ -182,7 +183,7 @@ internal class DefaultMultiYieldBalanceProducerTest { private companion object { val tonId = MockYieldBalanceWrapperDTOFactory.defaultStakingId - val solanaId = YieldsBalancesStore.StakingID( + val solanaId = StakingID( integrationId = "solana-sol-native-multivalidator-staking", address = "0x1", ) diff --git a/data/staking/src/test/kotlin/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducerTest.kt b/data/staking/src/test/kotlin/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducerTest.kt index 3522d505db..923d406900 100644 --- a/data/staking/src/test/kotlin/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducerTest.kt +++ b/data/staking/src/test/kotlin/com/tangem/data/staking/single/DefaultSingleYieldBalanceProducerTest.kt @@ -5,9 +5,9 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.test.data.staking.MockYieldBalanceWrapperDTOFactory import com.tangem.common.test.domain.token.MockCryptoCurrencyFactory import com.tangem.common.test.utils.getEmittedValues -import com.tangem.data.staking.store.YieldsBalancesStore import com.tangem.data.staking.toDomain import com.tangem.data.staking.utils.StakingIdFactory +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.staking.multi.MultiYieldBalanceProducer import com.tangem.domain.staking.multi.MultiYieldBalanceSupplier @@ -229,7 +229,7 @@ internal class DefaultSingleYieldBalanceProducerTest { val ton = mocks.createCoin(Blockchain.TON) val tonId = MockYieldBalanceWrapperDTOFactory.defaultStakingId - val solanaId = YieldsBalancesStore.StakingID( + val solanaId = StakingID( integrationId = "solana-sol-native-multivalidator-staking", address = "0x1", ) diff --git a/data/staking/src/test/kotlin/com/tangem/data/staking/store/YieldsBalancesStoreUpdateMethodsTest.kt b/data/staking/src/test/kotlin/com/tangem/data/staking/store/YieldsBalancesStoreUpdateMethodsTest.kt index f64a6da8e8..8c51eacb19 100644 --- a/data/staking/src/test/kotlin/com/tangem/data/staking/store/YieldsBalancesStoreUpdateMethodsTest.kt +++ b/data/staking/src/test/kotlin/com/tangem/data/staking/store/YieldsBalancesStoreUpdateMethodsTest.kt @@ -7,6 +7,7 @@ import com.tangem.data.staking.toDomain import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO import com.tangem.datasource.local.datastore.RuntimeSharedStore import com.tangem.domain.models.StatusSource +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.wallets.models.UserWalletId import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider @@ -179,7 +180,7 @@ internal class YieldsBalancesStoreUpdateMethodsTest { val stakingIds = setOf( stakingId, - YieldsBalancesStore.StakingID( + StakingID( integrationId = "solana-sol-native-multivalidator-staking", address = "0x1", ), diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/StakingID.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/StakingID.kt new file mode 100644 index 0000000000..6313b9277c --- /dev/null +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/StakingID.kt @@ -0,0 +1,4 @@ +package com.tangem.domain.staking.model + +// TODO: make part of YieldBalance in the future +data class StakingID(val integrationId: String, val address: String) \ No newline at end of file