From 5bc59f3789a71486099527601b8dcd1ef2476366 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Apr 2025 13:58:30 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../datasource/di/StakingStoreModule.kt | 29 ++++++---- .../staking/di/YieldBalanceFetcherModule.kt | 24 ++++++++ .../di/YieldBalanceProducerFactoryModule.kt | 28 ++++++++++ .../staking/di/YieldBalanceSupplierModule.kt | 56 +++++++++++++++++++ .../staking/model/stakekit/YieldBalance.kt | 10 ++++ 5 files changed, 137 insertions(+), 10 deletions(-) create mode 100644 data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceFetcherModule.kt create mode 100644 data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceProducerFactoryModule.kt create mode 100644 data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceSupplierModule.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt index 3d632eaf97..a631c02284 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt @@ -1,6 +1,7 @@ package com.tangem.datasource.di import android.content.Context +import androidx.datastore.core.DataStore import androidx.datastore.core.DataStoreFactory import androidx.datastore.dataStoreFile import com.squareup.moshi.Moshi @@ -49,21 +50,29 @@ internal object StakingStoreModule { @Provides @Singleton - fun provideStakingBalanceStore( + fun provideYieldsBalancesPersistenceStore( @NetworkMoshi moshi: Moshi, @ApplicationContext context: Context, dispatchers: CoroutineDispatcherProvider, + ): DataStore>> { + return DataStoreFactory.create( + serializer = MoshiDataStoreSerializer( + moshi = moshi, + types = mapWithStringKeyTypes(valueTypes = setTypes()), + defaultValue = emptyMap(), + ), + produceFile = { context.dataStoreFile(fileName = "yield_balances") }, + scope = CoroutineScope(context = dispatchers.io + SupervisorJob()), + ) + } + + @Provides + @Singleton + fun provideStakingBalanceStore( + persistenceStore: DataStore>>, ): StakingBalanceStore { return DefaultStakingBalanceStore( - persistenceStore = DataStoreFactory.create( - serializer = MoshiDataStoreSerializer( - moshi = moshi, - types = mapWithStringKeyTypes(valueTypes = setTypes()), - defaultValue = emptyMap(), - ), - produceFile = { context.dataStoreFile(fileName = "yield_balances") }, - scope = CoroutineScope(context = dispatchers.io + SupervisorJob()), - ), + persistenceStore = persistenceStore, runtimeStore = RuntimeSharedStore(), ) } diff --git a/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceFetcherModule.kt b/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceFetcherModule.kt new file mode 100644 index 0000000000..9224d037e3 --- /dev/null +++ b/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceFetcherModule.kt @@ -0,0 +1,24 @@ +package com.tangem.data.staking.di + +import com.tangem.data.staking.multi.DefaultMultiYieldBalanceFetcher +import com.tangem.data.staking.single.DefaultSingleYieldBalanceFetcher +import com.tangem.domain.staking.multi.MultiYieldBalanceFetcher +import com.tangem.domain.staking.single.SingleYieldBalanceFetcher +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal interface YieldBalanceFetcherModule { + + @Binds + @Singleton + fun bindSingleYieldBalanceFetcher(impl: DefaultSingleYieldBalanceFetcher): SingleYieldBalanceFetcher + + @Binds + @Singleton + fun bindMultiYieldBalanceFetcher(impl: DefaultMultiYieldBalanceFetcher): MultiYieldBalanceFetcher +} \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceProducerFactoryModule.kt b/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceProducerFactoryModule.kt new file mode 100644 index 0000000000..5f737af9ee --- /dev/null +++ b/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceProducerFactoryModule.kt @@ -0,0 +1,28 @@ +package com.tangem.data.staking.di + +import com.tangem.data.staking.multi.DefaultMultiYieldBalanceProducer +import com.tangem.data.staking.single.DefaultSingleYieldBalanceProducer +import com.tangem.domain.staking.multi.MultiYieldBalanceProducer +import com.tangem.domain.staking.single.SingleYieldBalanceProducer +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal interface YieldBalanceProducerFactoryModule { + + @Binds + @Singleton + fun bindSingleYieldBalanceProducerFactory( + impl: DefaultSingleYieldBalanceProducer.Factory, + ): SingleYieldBalanceProducer.Factory + + @Binds + @Singleton + fun bindMultiYieldBalanceProducerFactory( + impl: DefaultMultiYieldBalanceProducer.Factory, + ): MultiYieldBalanceProducer.Factory +} \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceSupplierModule.kt b/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceSupplierModule.kt new file mode 100644 index 0000000000..599d495859 --- /dev/null +++ b/data/staking/src/main/java/com/tangem/data/staking/di/YieldBalanceSupplierModule.kt @@ -0,0 +1,56 @@ +package com.tangem.data.staking.di + +import androidx.datastore.core.DataStore +import com.tangem.data.staking.store.DefaultYieldsBalancesStore +import com.tangem.data.staking.store.YieldsBalancesStore +import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO +import com.tangem.datasource.local.datastore.RuntimeSharedStore +import com.tangem.domain.staking.multi.MultiYieldBalanceProducer +import com.tangem.domain.staking.multi.MultiYieldBalanceSupplier +import com.tangem.domain.staking.single.SingleYieldBalanceProducer +import com.tangem.domain.staking.single.SingleYieldBalanceSupplier +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object YieldBalanceSupplierModule { + + @Provides + @Singleton + fun provideYieldsBalancesStore( + persistenceStore: DataStore>>, + dispatchers: CoroutineDispatcherProvider, + ): YieldsBalancesStore { + return DefaultYieldsBalancesStore( + runtimeStore = RuntimeSharedStore(), + persistenceStore = persistenceStore, + dispatchers = dispatchers, + ) + } + + @Provides + @Singleton + fun provideSingleYieldBalanceSupplier(factory: SingleYieldBalanceProducer.Factory): SingleYieldBalanceSupplier { + return object : SingleYieldBalanceSupplier( + factory = factory, + keyCreator = { + "single_yield_balance_${it.userWalletId.stringValue}_${it.network.id.value}_" + + it.network.derivationPath.value + }, + ) {} + } + + @Provides + @Singleton + fun provideMultiYieldBalanceSupplier(factory: MultiYieldBalanceProducer.Factory): MultiYieldBalanceSupplier { + return object : MultiYieldBalanceSupplier( + factory = factory, + keyCreator = { "multi_yields_balances_${it.userWalletId.stringValue}" }, + ) {} + } +} \ No newline at end of file diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt index 74d271b455..fc57d56fce 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalance.kt @@ -1,6 +1,7 @@ package com.tangem.domain.staking.model.stakekit import com.tangem.domain.models.StatusSource +import com.tangem.domain.staking.model.StakingID import com.tangem.domain.staking.model.stakekit.action.StakingActionType import org.joda.time.DateTime import java.math.BigDecimal @@ -19,6 +20,15 @@ sealed class YieldBalance { } } + fun getStakingId(): StakingID? { + val integrationId = integrationId + val address = address + + if (integrationId == null || address == null) return null + + return StakingID(integrationId = integrationId, address = address) + } + data class Data( override val integrationId: String?, override val address: String,