Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-15 12:46:32 +03:00
parent f48154daa9
commit 320b3deffb
14 changed files with 199 additions and 22 deletions

View file

@ -11,7 +11,6 @@ android {
}
dependencies {
/** Core modules */
implementation(projects.core.datasource)
implementation(projects.core.utils)
@ -33,14 +32,17 @@ dependencies {
// endregion
// region Others dependencies
implementation(deps.androidx.datastore)
implementation(deps.jodatime)
implementation(deps.kotlin.coroutines)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
implementation(projects.libs.blockchainSdk)
implementation(deps.tangem.blockchain) {
exclude(module = "joda-time")
}
// endregion
}

View file

@ -14,11 +14,11 @@ import com.tangem.data.staking.converters.transaction.StakingTransactionStatusCo
import com.tangem.data.staking.converters.transaction.StakingTransactionTypeConverter
import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.stakekit.StakeKitApi
import com.tangem.datasource.api.stakekit.models.request.Address
import com.tangem.datasource.api.stakekit.models.request.ConstructTransactionRequestBody
import com.tangem.datasource.api.stakekit.models.request.EnterActionRequestBody
import com.tangem.datasource.api.stakekit.models.request.YieldBalanceRequestBody
import com.tangem.datasource.api.stakekit.models.request.*
import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.getObjectListSync
import com.tangem.datasource.local.token.StakingBalanceStore
import com.tangem.datasource.local.token.StakingYieldsStore
import com.tangem.domain.core.lce.LceFlow
@ -33,14 +33,16 @@ import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.features.staking.api.featuretoggles.StakingFeatureToggles
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.toFormattedString
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.math.BigDecimal
@Suppress("LargeClass")
@Suppress("LargeClass", "LongParameterList")
internal class DefaultStakingRepository(
private val stakeKitApi: StakeKitApi,
private val appPreferencesStore: AppPreferencesStore,
private val stakingYieldsStore: StakingYieldsStore,
private val stakingBalanceStore: StakingBalanceStore,
private val cacheRegistry: CacheRegistry,
@ -372,6 +374,55 @@ internal class DefaultStakingRepository(
}
}
override suspend fun submitHash(transactionId: String, transactionHash: String) {
withContext(dispatchers.io) {
stakeKitApi.submitTransactionHash(
transactionId = transactionId,
body = SubmitTransactionHashRequestBody(
hash = transactionHash,
),
)
}
}
override suspend fun storeUnsubmittedHash(unsubmittedTransactionMetadata: UnsubmittedTransactionMetadata) {
withContext(dispatchers.io) {
appPreferencesStore.editData { preferences ->
val savedTransactions = preferences.getObjectListOrDefault<UnsubmittedTransactionMetadata>(
key = PreferencesKeys.UNSUBMITTED_TRANSACTIONS_KEY,
default = emptyList(),
)
preferences.setObjectList(
key = PreferencesKeys.UNSUBMITTED_TRANSACTIONS_KEY,
value = savedTransactions + unsubmittedTransactionMetadata,
)
}
}
}
override suspend fun sendUnsubmittedHashes() {
withContext(NonCancellable) {
val savedTransactions = appPreferencesStore.getObjectListSync<UnsubmittedTransactionMetadata>(
key = PreferencesKeys.UNSUBMITTED_TRANSACTIONS_KEY,
)
savedTransactions.forEach {
stakeKitApi.submitTransactionHash(
transactionId = it.transactionId,
body = SubmitTransactionHashRequestBody(hash = it.transactionHash),
)
}
appPreferencesStore.editData { mutablePreferences ->
mutablePreferences.setObjectList<UnsubmittedTransactionMetadata>(
key = PreferencesKeys.UNSUBMITTED_TRANSACTIONS_KEY,
value = emptyList(),
)
}
}
}
private fun findPrefetchedYield(yields: List<Yield>, currencyId: String, symbol: String): Yield? {
return yields.find { it.token.coinGeckoId == currencyId && it.token.symbol == symbol }
}

View file

@ -3,6 +3,7 @@ package com.tangem.data.staking.di
import com.tangem.data.common.cache.CacheRegistry
import com.tangem.data.staking.DefaultStakingRepository
import com.tangem.datasource.api.stakekit.StakeKitApi
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.StakingBalanceStore
import com.tangem.datasource.local.token.StakingYieldsStore
import com.tangem.domain.staking.repositories.StakingRepository
@ -22,6 +23,7 @@ internal object StakingDataModule {
@Singleton
fun provideStakingRepository(
stakeKitApi: StakeKitApi,
appPreferencesStore: AppPreferencesStore,
stakingTokenStore: StakingYieldsStore,
stakingBalanceStore: StakingBalanceStore,
dispatchers: CoroutineDispatcherProvider,
@ -30,6 +32,7 @@ internal object StakingDataModule {
): StakingRepository {
return DefaultStakingRepository(
stakeKitApi = stakeKitApi,
appPreferencesStore = appPreferencesStore,
stakingYieldsStore = stakingTokenStore,
stakingBalanceStore = stakingBalanceStore,
dispatchers = dispatchers,