From 553078f9f6fb8684e8ba64b45097f278508ebfaf Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 31 Jan 2025 17:44:43 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../assets/configs/feature_toggles_config.json | 4 ++++ .../models/response/model/NetworkTypeDTO.kt | 3 +++ .../stakekit/models/response/model/YieldDTO.kt | 3 +++ data/staking/build.gradle.kts | 1 + .../data/staking/DefaultStakingRepository.kt | 17 +++++++++++++++-- .../converters/StakingNetworkTypeConverter.kt | 2 ++ .../data/staking/converters/YieldConverter.kt | 5 ++--- .../tangem/data/staking/di/StakingDataModule.kt | 11 +++++++++++ .../toggles/DefaultStakingFeatureToggles.kt | 12 ++++++++++++ .../staking/model/stakekit/NetworkType.kt | 1 + .../domain/staking/model/stakekit/Yield.kt | 3 ++- .../staking/toggles/StakingFeatureToggles.kt | 5 +++++ 12 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 data/staking/src/main/java/com/tangem/data/staking/toggles/DefaultStakingFeatureToggles.kt create mode 100644 domain/staking/src/main/java/com/tangem/domain/staking/toggles/StakingFeatureToggles.kt diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json index f687e4fd35..463e2e5f2d 100644 --- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json @@ -38,5 +38,9 @@ { "name": "ONRAMP_HOT_TOKENS_ENABLED", "version": "undefined" + }, + { + "name": "STAKING_TON_ENABLED", + "version": "undefined" } ] diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/NetworkTypeDTO.kt b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/NetworkTypeDTO.kt index 486381bfcc..77bfadc65c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/NetworkTypeDTO.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/NetworkTypeDTO.kt @@ -203,5 +203,8 @@ enum class NetworkTypeDTO { @Json(name = "tron") TRON, + @Json(name = "ton") + TON, + UNKNOWN, } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt index 5411bcc840..b58c058063 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt @@ -99,6 +99,9 @@ data class YieldDTO( @Json(name = "jailed") JAILED, + @Json(name = "full") + FULL, + UNKNOWN, } } diff --git a/data/staking/build.gradle.kts b/data/staking/build.gradle.kts index e793d36c78..511b6f79b0 100644 --- a/data/staking/build.gradle.kts +++ b/data/staking/build.gradle.kts @@ -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) diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt index 93b0908573..7dd76ed33a 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt @@ -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, diff --git a/data/staking/src/main/java/com/tangem/data/staking/converters/StakingNetworkTypeConverter.kt b/data/staking/src/main/java/com/tangem/data/staking/converters/StakingNetworkTypeConverter.kt index e3b284f5fc..82ebb3dbbb 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/converters/StakingNetworkTypeConverter.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/converters/StakingNetworkTypeConverter.kt @@ -75,6 +75,7 @@ class StakingNetworkTypeConverter : TwoWayConverter 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 NetworkType.SOLANA -> NetworkTypeDTO.SOLANA NetworkType.TEZOS -> NetworkTypeDTO.TEZOS NetworkType.TRON -> NetworkTypeDTO.TRON + NetworkType.TON -> NetworkTypeDTO.TON else -> NetworkTypeDTO.UNKNOWN } } diff --git a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt index 431bf32bf5..cc61ab8eae 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt @@ -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 } } diff --git a/data/staking/src/main/java/com/tangem/data/staking/di/StakingDataModule.kt b/data/staking/src/main/java/com/tangem/data/staking/di/StakingDataModule.kt index 336bcb651e..3e777df680 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/di/StakingDataModule.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/di/StakingDataModule.kt @@ -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) + } } \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/toggles/DefaultStakingFeatureToggles.kt b/data/staking/src/main/java/com/tangem/data/staking/toggles/DefaultStakingFeatureToggles.kt new file mode 100644 index 0000000000..3b3259c021 --- /dev/null +++ b/data/staking/src/main/java/com/tangem/data/staking/toggles/DefaultStakingFeatureToggles.kt @@ -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") +} \ No newline at end of file diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/NetworkType.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/NetworkType.kt index 1d429683bc..2733a30688 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/NetworkType.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/NetworkType.kt @@ -67,5 +67,6 @@ enum class NetworkType { SOLANA, TEZOS, TRON, + TON, UNKNOWN, } \ No newline at end of file diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt index c3dd3636ce..3cfeb74f0b 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt @@ -73,6 +73,7 @@ data class Yield( DEACTIVATING, INACTIVE, JAILED, + FULL, UNKNOWN, } } @@ -93,7 +94,7 @@ data class Yield( val rewardClaiming: RewardClaiming, val defaultValidator: String?, val minimumStake: Int?, - val supportsMultipleValidators: Boolean, + val supportsMultipleValidators: Boolean?, val revshare: Enabled, val fee: Enabled, ) { diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/toggles/StakingFeatureToggles.kt b/domain/staking/src/main/java/com/tangem/domain/staking/toggles/StakingFeatureToggles.kt new file mode 100644 index 0000000000..47949204f9 --- /dev/null +++ b/domain/staking/src/main/java/com/tangem/domain/staking/toggles/StakingFeatureToggles.kt @@ -0,0 +1,5 @@ +package com.tangem.domain.staking.toggles + +interface StakingFeatureToggles { + val isTonStakingEnabled: Boolean +} \ No newline at end of file