Updated on 2026-08-14

This commit is contained in:
Tangem 2025-01-31 17:44:43 +05:00
parent 35d7b71361
commit 553078f9f6
12 changed files with 61 additions and 6 deletions

View file

@ -21,6 +21,7 @@ dependencies {
implementation(projects.data.common)
/** Domain modules */
implementation(projects.core.configToggles)
implementation(projects.domain.tokens.models)
implementation(projects.domain.staking)
implementation(projects.domain.wallets)

View file

@ -44,6 +44,7 @@ import com.tangem.domain.staking.model.stakekit.transaction.ActionParams
import com.tangem.domain.staking.model.stakekit.transaction.StakingGasEstimate
import com.tangem.domain.staking.model.stakekit.transaction.StakingTransaction
import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.staking.toggles.StakingFeatureToggles
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.walletmanager.WalletManagersFacade
@ -69,6 +70,7 @@ internal class DefaultStakingRepository(
private val dispatchers: CoroutineDispatcherProvider,
private val walletManagersFacade: WalletManagersFacade,
private val getUserWalletUseCase: GetUserWalletUseCase,
private val stakingFeatureToggles: StakingFeatureToggles,
moshi: Moshi,
) : StakingRepository {
@ -193,6 +195,8 @@ internal class DefaultStakingRepository(
userWalletId: UserWalletId,
cryptoCurrency: CryptoCurrency,
): StakingAvailability {
if (!checkFeatureToggleEnabled(cryptoCurrency.network.id)) return StakingAvailability.Unavailable
if (checkForInvalidCardBatch(userWalletId, cryptoCurrency)) return StakingAvailability.Unavailable
val rawCurrencyId = cryptoCurrency.id.rawCurrencyId ?: return StakingAvailability.Unavailable
@ -216,6 +220,13 @@ internal class DefaultStakingRepository(
}
}
private fun checkFeatureToggleEnabled(networkId: Network.ID): Boolean {
return when (Blockchain.fromId(networkId.value)) {
Blockchain.TON -> stakingFeatureToggles.isTonStakingEnabled
else -> true
}
}
private fun checkForInvalidCardBatch(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): Boolean {
val userWallet = getUserWalletUseCase(userWalletId).getOrElse {
error("Failed to get user wallet")
@ -562,8 +573,7 @@ internal class DefaultStakingRepository(
}
private fun getTransactionDataType(networkId: String, unsignedTransaction: String): TransactionData.Compiled.Data {
val blockchain = Blockchain.fromId(networkId)
return when (blockchain) {
return when (Blockchain.fromId(networkId)) {
Blockchain.Solana,
Blockchain.Cosmos,
-> TransactionData.Compiled.Data.Bytes(unsignedTransaction.hexToBytes())
@ -575,6 +585,7 @@ internal class DefaultStakingRepository(
?: error("Failed to parse Tron StakeKit transaction")
TransactionData.Compiled.Data.RawString(tronStakeKitTransaction.rawDataHex)
}
Blockchain.TON -> TransactionData.Compiled.Data.RawString(unsignedTransaction)
else -> error("Unsupported blockchain")
}
}
@ -621,6 +632,7 @@ internal class DefaultStakingRepository(
private companion object {
const val YIELDS_STORE_KEY = "yields"
const val TON_INTEGRATION_ID = "ton-ton-tonwhales-pools-staking"
const val SOLANA_INTEGRATION_ID = "solana-sol-native-multivalidator-staking"
const val COSMOS_INTEGRATION_ID = "cosmos-atom-native-staking"
const val ETHEREUM_POLYGON_INTEGRATION_ID = "ethereum-matic-native-staking"
@ -641,6 +653,7 @@ internal class DefaultStakingRepository(
// uncomment items as implementation is ready
val integrationIdMap = mapOf(
Blockchain.TON.run { id + toCoinId() } to TON_INTEGRATION_ID,
Blockchain.Solana.run { id + toCoinId() } to SOLANA_INTEGRATION_ID,
Blockchain.Cosmos.run { id + toCoinId() } to COSMOS_INTEGRATION_ID,
Blockchain.Tron.run { id + toCoinId() } to TRON_INTEGRATION_ID,

View file

@ -75,6 +75,7 @@ class StakingNetworkTypeConverter : TwoWayConverter<NetworkTypeDTO, NetworkType>
NetworkTypeDTO.SOLANA -> NetworkType.SOLANA
NetworkTypeDTO.TEZOS -> NetworkType.TEZOS
NetworkTypeDTO.TRON -> NetworkType.TRON
NetworkTypeDTO.TON -> NetworkType.TON
else -> NetworkType.UNKNOWN
}
}
@ -147,6 +148,7 @@ class StakingNetworkTypeConverter : TwoWayConverter<NetworkTypeDTO, NetworkType>
NetworkType.SOLANA -> NetworkTypeDTO.SOLANA
NetworkType.TEZOS -> NetworkTypeDTO.TEZOS
NetworkType.TRON -> NetworkTypeDTO.TRON
NetworkType.TON -> NetworkTypeDTO.TON
else -> NetworkTypeDTO.UNKNOWN
}
}

View file

@ -95,9 +95,7 @@ class YieldConverter(
rewardClaiming = convertRewardClaiming(metadataDTO.rewardClaiming.asMandatory("rewardClaiming")),
defaultValidator = metadataDTO.defaultValidator,
minimumStake = metadataDTO.minimumStake,
supportsMultipleValidators = metadataDTO.supportsMultipleValidators.asMandatory(
"supportsMultipleValidators",
),
supportsMultipleValidators = metadataDTO.supportsMultipleValidators,
revshare = convertEnabled(metadataDTO.revshare.asMandatory("revshare")),
fee = convertEnabled(metadataDTO.fee.asMandatory("fee")),
)
@ -146,6 +144,7 @@ class YieldConverter(
ValidatorStatusDTO.DEACTIVATING -> ValidatorStatus.DEACTIVATING
ValidatorStatusDTO.INACTIVE -> ValidatorStatus.INACTIVE
ValidatorStatusDTO.JAILED -> ValidatorStatus.JAILED
ValidatorStatusDTO.FULL -> ValidatorStatus.FULL
else -> ValidatorStatus.UNKNOWN
}
}

View file

@ -2,12 +2,14 @@ package com.tangem.data.staking.di
import com.squareup.moshi.Moshi
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
import com.tangem.data.common.cache.CacheRegistry
import com.tangem.data.staking.*
import com.tangem.data.staking.DefaultStakingErrorResolver
import com.tangem.data.staking.DefaultStakingRepository
import com.tangem.data.staking.DefaultStakingTransactionHashRepository
import com.tangem.data.staking.converters.error.StakeKitErrorConverter
import com.tangem.data.staking.toggles.DefaultStakingFeatureToggles
import com.tangem.datasource.api.stakekit.StakeKitApi
import com.tangem.datasource.api.stakekit.models.response.model.error.StakeKitErrorResponse
import com.tangem.datasource.di.NetworkMoshi
@ -16,6 +18,7 @@ import com.tangem.datasource.local.token.StakingActionsStore
import com.tangem.datasource.local.token.StakingBalanceStore
import com.tangem.datasource.local.token.StakingYieldsStore
import com.tangem.domain.staking.repositories.*
import com.tangem.domain.staking.toggles.StakingFeatureToggles
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -39,6 +42,7 @@ internal object StakingDataModule {
dispatchers: CoroutineDispatcherProvider,
walletManagersFacade: WalletManagersFacade,
getUserWalletUseCase: GetUserWalletUseCase,
stakingFeatureToggles: StakingFeatureToggles,
@NetworkMoshi moshi: Moshi,
): StakingRepository {
return DefaultStakingRepository(
@ -49,6 +53,7 @@ internal object StakingDataModule {
dispatchers = dispatchers,
walletManagersFacade = walletManagersFacade,
getUserWalletUseCase = getUserWalletUseCase,
stakingFeatureToggles = stakingFeatureToggles,
moshi = moshi,
)
}
@ -91,4 +96,10 @@ internal object StakingDataModule {
analyticsEventHandler = analyticsEventHandler,
)
}
@Provides
@Singleton
internal fun provideFeatureToggles(featureTogglesManager: FeatureTogglesManager): StakingFeatureToggles {
return DefaultStakingFeatureToggles(featureTogglesManager)
}
}

View file

@ -0,0 +1,12 @@
package com.tangem.data.staking.toggles
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
import com.tangem.domain.staking.toggles.StakingFeatureToggles
internal class DefaultStakingFeatureToggles(
private val featureTogglesManager: FeatureTogglesManager,
) : StakingFeatureToggles {
override val isTonStakingEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(name = "STAKING_TON_ENABLED")
}