From cfdc1ea05c4132a58b89ba34b26bc660a3c4f217 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 17 Jul 2025 15:30:03 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../common/redux/legacy/LegacyMiddleware.kt | 5 +- .../tap/di/domain/TransactionDomainModule.kt | 3 + .../tangem/tap/di/hot/TangemHotSdkModule.kt | 6 ++ .../card/DefaultDerivationsRepository.kt | 12 ++- .../tap/domain/hot/HotWalletAccessor.kt | 44 +++++++++++ .../domain/hot/HotWalletPasswordRequester.kt | 9 +++ .../tangem/tap/domain/hot/TangemHotSigner.kt | 78 +++++++++++++++++++ .../features/details/redux/DetailsAction.kt | 2 +- .../tap/features/home/DefaultHomeComponent.kt | 4 +- .../tap/features/home/redux/HomeState.kt | 1 - .../hot/DefaultHotWalletPasswordRequester.kt | 13 ++++ .../converter/UserWalletItemUMConverter.kt | 21 +++-- .../configs/feature_toggles_config.json | 4 + .../repository/DefaultCurrenciesRepository.kt | 8 +- .../tokens/repository/CurrenciesRepository.kt | 2 +- .../tokens/wallet/WalletBalanceFetcher.kt | 2 +- .../usecase/SendTransactionUseCase.kt | 28 ++++--- .../wallets/builder/HotUserWalletBuilder.kt | 3 +- .../impl/model/MarketsPortfolioModel.kt | 4 +- 19 files changed, 211 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/domain/hot/HotWalletAccessor.kt create mode 100644 app/src/main/java/com/tangem/tap/domain/hot/HotWalletPasswordRequester.kt create mode 100644 app/src/main/java/com/tangem/tap/domain/hot/TangemHotSigner.kt create mode 100644 app/src/main/java/com/tangem/tap/features/hot/DefaultHotWalletPasswordRequester.kt diff --git a/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt index a950925df9..d2e5f890b2 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt @@ -2,7 +2,7 @@ package com.tangem.tap.common.redux.legacy import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.domain.redux.LegacyAction -import com.tangem.domain.wallets.models.requireColdWallet +import com.tangem.domain.wallets.models.UserWallet import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.extensions.inject import com.tangem.tap.common.redux.AppState @@ -37,8 +37,7 @@ internal object LegacyMiddleware { ) store.dispatchWithMain( DetailsAction.PrepareScreen( - // TODO [REDACTED_TASK_KEY] - scanResponse = selectedUserWallet.requireColdWallet().scanResponse, + scanResponse = (selectedUserWallet as? UserWallet.Cold)?.scanResponse, initializedAppSettingsState = initializedAppSettingsStateContent, ), ) diff --git a/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt index 0e1a88fec9..73b6077ca8 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt @@ -11,6 +11,7 @@ import com.tangem.domain.transaction.FeeRepository import com.tangem.domain.transaction.TransactionRepository import com.tangem.domain.transaction.usecase.* import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.tap.domain.hot.TangemHotSigner import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -43,6 +44,7 @@ internal object TransactionDomainModule { transactionRepository: TransactionRepository, walletManagersFacade: WalletManagersFacade, singleNetworkStatusFetcher: SingleNetworkStatusFetcher, + tangemHotSignerFactory: TangemHotSigner.Factory, ): SendTransactionUseCase { return SendTransactionUseCase( demoConfig = DemoConfig(), @@ -50,6 +52,7 @@ internal object TransactionDomainModule { transactionRepository = transactionRepository, walletManagersFacade = walletManagersFacade, singleNetworkStatusFetcher = singleNetworkStatusFetcher, + getHotSigner = tangemHotSignerFactory::create, ) } diff --git a/app/src/main/java/com/tangem/tap/di/hot/TangemHotSdkModule.kt b/app/src/main/java/com/tangem/tap/di/hot/TangemHotSdkModule.kt index c21b55928b..f68e642f94 100644 --- a/app/src/main/java/com/tangem/tap/di/hot/TangemHotSdkModule.kt +++ b/app/src/main/java/com/tangem/tap/di/hot/TangemHotSdkModule.kt @@ -1,6 +1,8 @@ package com.tangem.tap.di.hot import com.tangem.hot.sdk.TangemHotSdk +import com.tangem.tap.domain.hot.HotWalletPasswordRequester +import com.tangem.tap.features.hot.DefaultHotWalletPasswordRequester import com.tangem.tap.features.hot.TangemHotSDKProxy import dagger.Binds import dagger.Module @@ -15,4 +17,8 @@ internal interface TangemHotSdkModule { @Binds @Singleton fun bindTangemHotSdk(proxy: TangemHotSDKProxy): TangemHotSdk + + @Binds + @Singleton + fun bindHotWalletPasswordRequester(impl: DefaultHotWalletPasswordRequester): HotWalletPasswordRequester } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt index bfba7bd2cd..f0c52c1fb2 100644 --- a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt @@ -61,7 +61,11 @@ internal class DefaultDerivationsRepository( userWalletsStore.getSyncOrNull(userWalletId) ?: error("User wallet not found") } - userWallet.requireColdWallet() // TODO [REDACTED_TASK_KEY] + if (userWallet is UserWallet.Hot) { + return + } + + userWallet.requireColdWallet() if (!userWallet.scanResponse.card.settings.isHDWalletAllowed) { Timber.d("Nothing to derive") @@ -84,8 +88,12 @@ internal class DefaultDerivationsRepository( ): Boolean { val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("User wallet not found") + if (userWallet is UserWallet.Hot) { + return false + } + val derivations = - MissedDerivationsFinder(scanResponse = userWallet.requireColdWallet().scanResponse) // TODO [REDACTED_TASK_KEY] + MissedDerivationsFinder(scanResponse = userWallet.requireColdWallet().scanResponse) .findByNetworks( networksWithDerivationPath.mapNotNull { (backendId, extraDerivationPath) -> networkFactory.create( diff --git a/app/src/main/java/com/tangem/tap/domain/hot/HotWalletAccessor.kt b/app/src/main/java/com/tangem/tap/domain/hot/HotWalletAccessor.kt new file mode 100644 index 0000000000..5014f950b6 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/hot/HotWalletAccessor.kt @@ -0,0 +1,44 @@ +package com.tangem.tap.domain.hot + +import com.tangem.hot.sdk.TangemHotSdk +import com.tangem.hot.sdk.model.* +import javax.inject.Inject + +class HotWalletAccessor @Inject constructor( + private val tangemHotSdk: TangemHotSdk, + private val hotWalletPasswordRequester: HotWalletPasswordRequester, +) { + + suspend fun signHashes(hotWalletId: HotWalletId, dataToSign: List): List { + val auth = when (hotWalletId.authType) { + HotWalletId.AuthType.NoPassword -> HotAuth.NoAuth + HotWalletId.AuthType.Password -> { + hotWalletPasswordRequester.requestPassword(hotWalletId) + } + HotWalletId.AuthType.Biometry -> HotAuth.Biometry + } + + return runCatching { + tangemHotSdk.signHashes( + unlockHotWallet = UnlockHotWallet( + walletId = hotWalletId, + auth = auth, + ), + dataToSign = dataToSign, + ) + }.getOrElse { + if (hotWalletId.authType == HotWalletId.AuthType.Biometry) { + val passwordAuth = hotWalletPasswordRequester.requestPassword(hotWalletId) + tangemHotSdk.signHashes( + unlockHotWallet = UnlockHotWallet( + walletId = hotWalletId, + auth = passwordAuth, + ), + dataToSign = dataToSign, + ) + } else { + throw it + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/hot/HotWalletPasswordRequester.kt b/app/src/main/java/com/tangem/tap/domain/hot/HotWalletPasswordRequester.kt new file mode 100644 index 0000000000..1f80fd785f --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/hot/HotWalletPasswordRequester.kt @@ -0,0 +1,9 @@ +package com.tangem.tap.domain.hot + +import com.tangem.hot.sdk.model.HotAuth +import com.tangem.hot.sdk.model.HotWalletId + +interface HotWalletPasswordRequester { + + suspend fun requestPassword(hotWalletId: HotWalletId): HotAuth.Password +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/hot/TangemHotSigner.kt b/app/src/main/java/com/tangem/tap/domain/hot/TangemHotSigner.kt new file mode 100644 index 0000000000..d70815434d --- /dev/null +++ b/app/src/main/java/com/tangem/tap/domain/hot/TangemHotSigner.kt @@ -0,0 +1,78 @@ +package com.tangem.tap.domain.hot + +import com.tangem.blockchain.common.TransactionSigner +import com.tangem.blockchain.common.Wallet +import com.tangem.common.CompletionResult +import com.tangem.common.core.TangemSdkError +import com.tangem.common.map +import com.tangem.domain.wallets.models.UserWallet +import com.tangem.hot.sdk.model.DataToSign +import com.tangem.operations.sign.SignData +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +class TangemHotSigner @AssistedInject constructor( + @Assisted private val userWallet: UserWallet.Hot, + private val hotWalletAccessor: HotWalletAccessor, +) : TransactionSigner { + + override suspend fun sign(hash: ByteArray, publicKey: Wallet.PublicKey): CompletionResult { + return sign(listOf(hash), publicKey).map { it.first() } + } + + override suspend fun sign( + hashes: List, + publicKey: Wallet.PublicKey, + ): CompletionResult> { + val wallet = userWallet.wallets.orEmpty().firstOrNull { it.publicKey == publicKey.seedKey } + ?: return CompletionResult.Failure( + TangemSdkError.ExceptionError(IllegalStateException("wallet is locked")), + ) + + val result = hotWalletAccessor.signHashes( + hotWalletId = userWallet.hotWalletId, + dataToSign = listOf( + DataToSign( + curve = wallet.curve, + hashes = hashes, + derivationPath = publicKey.derivationPath, + ), + ), + ) + + return CompletionResult.Success(result.map { it.signatures }.flatten()) + } + + override suspend fun multiSign( + dataToSign: List, + publicKey: Wallet.PublicKey, + ): CompletionResult> { + val result = hotWalletAccessor.signHashes( + hotWalletId = userWallet.hotWalletId, + dataToSign = dataToSign.map { signData -> + val wallet = userWallet.wallets.orEmpty().firstOrNull { it.publicKey == signData.publicKey } + ?: return CompletionResult.Failure( + TangemSdkError.ExceptionError(IllegalStateException("wallet is locked")), + ) + + DataToSign( + curve = wallet.curve, + hashes = listOf(signData.hash), + derivationPath = signData.derivationPath, + ) + }, + ) + + return CompletionResult.Success( + result.mapIndexed { index, data -> + dataToSign[index].publicKey to data.signatures.first() + }.toMap(), + ) + } + + @AssistedFactory + interface Factory { + fun create(@Assisted userWallet: UserWallet.Hot): TangemHotSigner + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt index 56b822cc8e..d398da42c9 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt @@ -9,7 +9,7 @@ import org.rekotlin.Action sealed class DetailsAction : Action { data class PrepareScreen( - val scanResponse: ScanResponse, + val scanResponse: ScanResponse?, val initializedAppSettingsState: AppSettingsState, ) : DetailsAction() diff --git a/app/src/main/java/com/tangem/tap/features/home/DefaultHomeComponent.kt b/app/src/main/java/com/tangem/tap/features/home/DefaultHomeComponent.kt index ade00b0024..b89b6f5255 100644 --- a/app/src/main/java/com/tangem/tap/features/home/DefaultHomeComponent.kt +++ b/app/src/main/java/com/tangem/tap/features/home/DefaultHomeComponent.kt @@ -13,6 +13,7 @@ import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.components.SystemBarsIconsDisposable import com.tangem.core.ui.utils.ChangeRootBackgroundColorEffect import com.tangem.core.ui.utils.findActivity +import com.tangem.features.hotwallet.HotWalletFeatureToggles import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.home.api.HomeComponent import com.tangem.tap.features.home.compose.StoriesScreen @@ -29,6 +30,7 @@ import org.rekotlin.StoreSubscriber internal class DefaultHomeComponent @AssistedInject constructor( @Assisted appComponentContext: AppComponentContext, @Assisted params: Unit, + private val hotWalletFeatureToggles: HotWalletFeatureToggles, ) : HomeComponent, AppComponentContext by appComponentContext, StoreSubscriber { private val model: HomeModel = getOrCreateModel() @@ -58,7 +60,7 @@ internal class DefaultHomeComponent @AssistedInject constructor( val activity = LocalContext.current.findActivity() BackHandler(onBack = activity::finish) SystemBarsIconsDisposable(darkIcons = false) - if (homeState.value.isV2StoriesEnabled) { + if (hotWalletFeatureToggles.isHotWalletEnabled) { StoriesScreenV2( homeState = homeState, onCreateNewWalletButtonClick = model::onCreateNewWalletScreen, diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt index d36ea27e67..b1d45779ba 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeState.kt @@ -7,7 +7,6 @@ import org.rekotlin.StateType // todo refactor [REDACTED_TASK_KEY] data class HomeState( val scanInProgress: Boolean = false, - val isV2StoriesEnabled: Boolean = false, val stories: ImmutableList = getRestrictedStories().toImmutableList(), ) : StateType { diff --git a/app/src/main/java/com/tangem/tap/features/hot/DefaultHotWalletPasswordRequester.kt b/app/src/main/java/com/tangem/tap/features/hot/DefaultHotWalletPasswordRequester.kt new file mode 100644 index 0000000000..b9d1c6ae6c --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/hot/DefaultHotWalletPasswordRequester.kt @@ -0,0 +1,13 @@ +package com.tangem.tap.features.hot + +import com.tangem.hot.sdk.model.HotAuth +import com.tangem.hot.sdk.model.HotWalletId +import com.tangem.tap.domain.hot.HotWalletPasswordRequester +import javax.inject.Inject + +class DefaultHotWalletPasswordRequester @Inject constructor() : HotWalletPasswordRequester { + + override suspend fun requestPassword(hotWalletId: HotWalletId): HotAuth.Password { + return HotAuth.Password("TODO [REDACTED_TASK_KEY]".toCharArray()) // TODO [REDACTED_TASK_KEY] + } +} \ No newline at end of file diff --git a/common/ui/src/main/java/com/tangem/common/ui/userwallet/converter/UserWalletItemUMConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/userwallet/converter/UserWalletItemUMConverter.kt index 534a8de836..043582d194 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/userwallet/converter/UserWalletItemUMConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/userwallet/converter/UserWalletItemUMConverter.kt @@ -15,7 +15,6 @@ import com.tangem.domain.tokens.model.TotalFiatBalance import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.isLocked -import com.tangem.domain.wallets.models.requireColdWallet import com.tangem.utils.converter.Converter /** @@ -57,13 +56,19 @@ class UserWalletItemUMConverter( } private fun getInfo(userWallet: UserWallet): UserWalletItemUM.Information.Loaded { - userWallet.requireColdWallet() - val cardCount = userWallet.getCardsCount() ?: 1 - val text = TextReference.PluralRes( - id = R.plurals.card_label_card_count, - count = cardCount, - formatArgs = wrappedList(cardCount), - ) + val text = when (userWallet) { + is UserWallet.Cold -> { + val cardCount = userWallet.getCardsCount() ?: 1 + TextReference.PluralRes( + id = R.plurals.card_label_card_count, + count = cardCount, + formatArgs = wrappedList(cardCount), + ) + } + is UserWallet.Hot -> { + TextReference.Res(R.string.hw_mobile_wallet) + } + } return UserWalletItemUM.Information.Loaded(text) } 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 f6763183c0..6b99bc3c7e 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 @@ -46,5 +46,9 @@ { "name": "WALLET_BALANCE_FETCHER_ENABLED", "version": "5.27.0" + }, + { + "name": "HOT_WALLET_ENABLED", + "version": "undefined" } ] diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index 9d94d99608..6d25a6c018 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -564,7 +564,6 @@ internal class DefaultCurrenciesRepository( userWallet: UserWallet, currencyRawId: CryptoCurrency.RawID, ): Flow> { - userWallet.requireColdWallet() // TODO [REDACTED_TASK_KEY] return when { userWallet.isMultiCurrency -> { getSavedUserTokensResponse(userWallet.walletId).map { storedTokens -> @@ -581,7 +580,7 @@ internal class DefaultCurrenciesRepository( else -> { val currencies = - if (userWallet.scanResponse.cardTypesResolver.isSingleWalletWithToken()) { + if (userWallet.requireColdWallet().scanResponse.cardTypesResolver.isSingleWalletWithToken()) { getSingleCurrencyWalletWithCardCurrencies(userWallet.walletId) } else { val currency = @@ -619,9 +618,8 @@ internal class DefaultCurrenciesRepository( ) } - override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver { - return userWalletsStore.getSyncStrict(userWalletId) - .requireColdWallet().cardTypesResolver // TODO [REDACTED_TASK_KEY] + override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? { + return (userWalletsStore.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver } private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow> { diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt index 1807cc4a60..9225d49a40 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt @@ -265,5 +265,5 @@ interface CurrenciesRepository { suspend fun syncTokens(userWalletId: UserWalletId) @Throws - fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver + fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? } \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt index ef5b7253e7..8750af2aa1 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/wallet/WalletBalanceFetcher.kt @@ -76,7 +76,7 @@ class WalletBalanceFetcher internal constructor( val cardTypesResolver = currenciesRepository.getCardTypesResolver(userWalletId = userWalletId) val fetcher = when { - cardTypesResolver.isMultiwalletAllowed() -> multiWalletBalanceFetcher + cardTypesResolver == null || cardTypesResolver.isMultiwalletAllowed() -> multiWalletBalanceFetcher cardTypesResolver.isSingleWalletWithToken() -> singleWalletWithTokenBalanceFetcher cardTypesResolver.isSingleWallet() -> singleWalletBalanceFetcher else -> error("Unknown type of wallet: $userWalletId") diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt index fb901ec9f1..0c9265cfa8 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt @@ -25,7 +25,6 @@ import com.tangem.domain.transaction.error.SendTransactionError import com.tangem.domain.transaction.error.parseWrappedError import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.UserWallet -import com.tangem.domain.wallets.models.requireColdWallet class SendTransactionUseCase( private val demoConfig: DemoConfig, @@ -33,6 +32,7 @@ class SendTransactionUseCase( private val transactionRepository: TransactionRepository, private val walletManagersFacade: WalletManagersFacade, private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher, + private val getHotSigner: (UserWallet.Hot) -> TransactionSigner, ) { suspend operator fun invoke( txsData: List, @@ -40,22 +40,30 @@ class SendTransactionUseCase( network: Network, sendMode: TransactionSender.MultipleTransactionSendMode, ): Either> { - userWallet.requireColdWallet() // TODO [REDACTED_TASK_KEY] + val signer = when (userWallet) { + is UserWallet.Cold -> { + val card = userWallet.scanResponse.card + val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins - val card = userWallet.scanResponse.card - val isCardNotBackedUp = card.backupStatus?.isActive != true && !card.isTangemTwins + val coldSigner = cardSdkConfigRepository.getCommonSigner( + cardId = card.cardId.takeIf { isCardNotBackedUp }, + twinKey = TwinKey.getOrNull(scanResponse = userWallet.scanResponse), + ) - val signer = cardSdkConfigRepository.getCommonSigner( - cardId = card.cardId.takeIf { isCardNotBackedUp }, - twinKey = TwinKey.getOrNull(scanResponse = userWallet.scanResponse), - ) + coldSigner + } + is UserWallet.Hot -> { + getHotSigner(userWallet) + } + } val linkedTerminal = cardSdkConfigRepository.isLinkedTerminal() - if (userWallet.scanResponse.card.isStart2Coin) { + if (userWallet is UserWallet.Cold && userWallet.scanResponse.card.isStart2Coin) { cardSdkConfigRepository.setLinkedTerminal(false) } + val sendResult = try { - if (demoConfig.isDemoCardId(cardId = userWallet.cardId)) { + if (userWallet is UserWallet.Cold && demoConfig.isDemoCardId(cardId = userWallet.cardId)) { sendDemo( userWallet = userWallet, network = network, diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/builder/HotUserWalletBuilder.kt b/domain/wallets/src/main/java/com/tangem/domain/wallets/builder/HotUserWalletBuilder.kt index 824b1b9e5a..79f665387d 100644 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/builder/HotUserWalletBuilder.kt +++ b/domain/wallets/src/main/java/com/tangem/domain/wallets/builder/HotUserWalletBuilder.kt @@ -4,7 +4,6 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.derivation.DerivationStyle import com.tangem.domain.models.MobileWallet import com.tangem.domain.wallets.models.UserWallet -import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase import com.tangem.hot.sdk.TangemHotSdk import com.tangem.hot.sdk.model.DeriveWalletRequest @@ -58,7 +57,7 @@ class HotUserWalletBuilder @AssistedInject constructor( UserWallet.Hot( name = generateWalletNameUseCase.invokeForHot(), - walletId = UserWalletId(wallets.first().publicKey), + walletId = UserWalletIdBuilder.walletPublicKey(wallets.first().publicKey), hotWalletId = hotWalletId, wallets = wallets, backedUp = false, diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt index dd927115b7..e155d62edf 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MarketsPortfolioModel.kt @@ -25,7 +25,6 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.isMultiCurrency -import com.tangem.domain.wallets.models.requireColdWallet import com.tangem.domain.wallets.usecase.GetCardImageUseCase import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase import com.tangem.features.markets.impl.R @@ -194,8 +193,7 @@ internal class MarketsPortfolioModel @Inject constructor( private fun loadArtworks(wallets: List) { modelScope.launch { loadArtworksMutex.withLock { - wallets.forEach { wallet -> - wallet.requireColdWallet() // TODO [REDACTED_TASK_KEY] + wallets.filterIsInstance().forEach { wallet -> if (!loadedArtworks.containsKey(wallet.walletId)) { val artwork = getCardImageUseCase( cardId = wallet.cardId,