diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt index 216af3ca6d..f04b03cef6 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/DefaultScanCardProcessor.kt @@ -20,6 +20,7 @@ internal class DefaultScanCardProcessor( cardId: String?, allowsRequestAccessCodeFromRepository: Boolean, analyticsSource: AnalyticsParam.ScreensSources, + shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult { return if (isNewCardScanningEnabled) { UseCaseScanProcessor.scan(cardId, allowsRequestAccessCodeFromRepository) @@ -28,6 +29,7 @@ internal class DefaultScanCardProcessor( analyticsSource = analyticsSource, cardId = cardId, allowsRequestAccessCodeFromRepository = allowsRequestAccessCodeFromRepository, + shouldCheckIsAlreadyActivated = shouldCheckIsAlreadyActivated, ) } } @@ -35,6 +37,7 @@ internal class DefaultScanCardProcessor( @Suppress("LongParameterList") override suspend fun scan( analyticsSource: AnalyticsParam.ScreensSources, + shouldCheckIsAlreadyActivated: Boolean, cardId: String?, onProgressStateChange: suspend (showProgress: Boolean) -> Unit, onWalletNotCreated: suspend () -> Unit, @@ -56,6 +59,7 @@ internal class DefaultScanCardProcessor( } else { legacyScanProcessor.scan( analyticsSource = analyticsSource, + shouldCheckIsAlreadyActivated = shouldCheckIsAlreadyActivated, cardId = cardId, onProgressStateChange = onProgressStateChange, onWalletNotCreated = onWalletNotCreated, diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt index ad63237780..fd2e386a76 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/LegacyScanProcessor.kt @@ -55,10 +55,12 @@ internal class LegacyScanProcessor @Inject constructor( cardId: String? = null, allowsRequestAccessCodeFromRepository: Boolean = false, analyticsSource: AnalyticsParam.ScreensSources, + shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult { return tangemSdkManager.scanProduct( cardId = cardId, allowsRequestAccessCodeFromRepository = allowsRequestAccessCodeFromRepository, + shouldCheckIsAlreadyActivated = shouldCheckIsAlreadyActivated, ) .doOnFailure { error -> onScanFailure(analyticsSource = analyticsSource, error = error, onFailure = {}, onCancel = {}) @@ -68,6 +70,7 @@ internal class LegacyScanProcessor @Inject constructor( @Suppress("LongParameterList") suspend fun scan( analyticsSource: AnalyticsParam.ScreensSources, + shouldCheckIsAlreadyActivated: Boolean, cardId: String?, onProgressStateChange: suspend (showProgress: Boolean) -> Unit, onWalletNotCreated: suspend () -> Unit, @@ -80,7 +83,10 @@ internal class LegacyScanProcessor @Inject constructor( tangemSdkManager.changeDisplayedCardIdNumbersCount(null) - val result = tangemSdkManager.scanProduct(cardId) + val result = tangemSdkManager.scanProduct( + cardId = cardId, + shouldCheckIsAlreadyActivated = shouldCheckIsAlreadyActivated, + ) val analyticsEvent = Basic.CardWasScanned(analyticsSource) store.dispatchOnMain(GlobalAction.ScanFailsCounter.ChooseBehavior(result, analyticsSource)) diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/repository/DefaultScanCardRepository.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/repository/DefaultScanCardRepository.kt index 1a4b50cc5a..ecd2cffeb0 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/repository/DefaultScanCardRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/repository/DefaultScanCardRepository.kt @@ -13,11 +13,16 @@ internal class DefaultScanCardRepository( private val exceptionConverter = ScanCardExceptionConverter() - override suspend fun scanCard(cardId: String?, allowRequestAccessCodeFromStorage: Boolean): ScanResponse { + override suspend fun scanCard( + cardId: String?, + allowRequestAccessCodeFromStorage: Boolean, + shouldCheckIsAlreadyActivated: Boolean, + ): ScanResponse { return when ( val result = tangemSdkManager.scanProduct( cardId = cardId, allowsRequestAccessCodeFromRepository = allowRequestAccessCodeFromStorage, + shouldCheckIsAlreadyActivated = shouldCheckIsAlreadyActivated, ) ) { is CompletionResult.Success -> result.data diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt index 4db814b36c..4d923813ad 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt @@ -163,6 +163,7 @@ internal class DefaultTangemSdkManager( cardId: String?, messageRes: Int?, allowsRequestAccessCodeFromRepository: Boolean, + shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult { val message = Message(resources.getStringSafe(messageRes ?: R.string.initial_message_scan_header)) return coroutineScope { @@ -173,7 +174,7 @@ internal class DefaultTangemSdkManager( allowsRequestAccessCodeFromRepository = allowsRequestAccessCodeFromRepository, visaCardScanHandler = visaCardScanHandler, visaCoroutineScope = this, - shouldCheckIsAlreadyActivated = true, + shouldCheckIsAlreadyActivated = shouldCheckIsAlreadyActivated, onboardingV2FeatureToggles = onboardingV2FeatureToggles, ), cardId = cardId, diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt index 00e4ea971e..c70dc421f4 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt @@ -59,6 +59,7 @@ class MockTangemSdkManager( cardId: String?, messageRes: Int?, allowsRequestAccessCodeFromRepository: Boolean, + shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult { return MockProvider.getScanResponse() } diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt index 2f49d686db..80cbe137b9 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt @@ -296,7 +296,9 @@ internal class DefaultUserWalletsListRepository( } val scanResponse = unlockMethod.scanResponse ?: run { - when (val res = tangemSdkManagerProvider().scanProduct()) { + when (val res = tangemSdkManagerProvider().scanProduct( + shouldCheckIsAlreadyActivated = false, + )) { is CompletionResult.Failure -> raise(UnlockWalletError.UserCancelled) is CompletionResult.Success -> res.data } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt index 2b26905caf..22e94ae7d3 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/model/CardSettingsModel.kt @@ -107,6 +107,7 @@ internal class CardSettingsModel @Inject constructor( private fun scanCard() = modelScope.launch { scanCardProcessor.scan( analyticsSource = com.tangem.core.analytics.models.AnalyticsParam.ScreensSources.Settings, + shouldCheckIsAlreadyActivated = false, allowsRequestAccessCodeFromRepository = true, ) .doOnSuccess { scanResponse -> diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt index f7a54bccda..bd97734029 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardProcessor.kt @@ -11,10 +11,12 @@ interface ScanCardProcessor { cardId: String? = null, allowsRequestAccessCodeFromRepository: Boolean = false, analyticsSource: AnalyticsParam.ScreensSources, + shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult suspend fun scan( analyticsSource: AnalyticsParam.ScreensSources, + shouldCheckIsAlreadyActivated: Boolean, cardId: String? = null, onProgressStateChange: suspend (showProgress: Boolean) -> Unit = {}, onWalletNotCreated: suspend () -> Unit = {}, diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardUseCase.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardUseCase.kt index 04abfb1fce..046e484ec6 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardUseCase.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/ScanCardUseCase.kt @@ -49,9 +49,14 @@ class ScanCardUseCase( cardId: String?, allowRequestAccessCodeFromStorage: Boolean, ): Either { - return Either.catch { scanCardRepository.scanCard(cardId, allowRequestAccessCodeFromStorage) } - .mapLeft { e -> - e as? ScanCardException ?: ScanCardException.UnknownException(e) - } + return Either.catch { + scanCardRepository.scanCard( + cardId = cardId, + allowRequestAccessCodeFromStorage = allowRequestAccessCodeFromStorage, + shouldCheckIsAlreadyActivated = true, // TODO use correct when enable NEW_CARD_SCANNING_ENABLED + ) + }.mapLeft { e -> + e as? ScanCardException ?: ScanCardException.UnknownException(e) + } } } \ No newline at end of file diff --git a/domain/card/src/main/kotlin/com/tangem/domain/card/repository/ScanCardRepository.kt b/domain/card/src/main/kotlin/com/tangem/domain/card/repository/ScanCardRepository.kt index 90f2016383..0774f11004 100644 --- a/domain/card/src/main/kotlin/com/tangem/domain/card/repository/ScanCardRepository.kt +++ b/domain/card/src/main/kotlin/com/tangem/domain/card/repository/ScanCardRepository.kt @@ -17,5 +17,9 @@ interface ScanCardRepository { * @return a [ScanResponse] object with the result of the scan. * @throws [ScanCardException] if the scan process fails. */ - suspend fun scanCard(cardId: String?, allowRequestAccessCodeFromStorage: Boolean): ScanResponse + suspend fun scanCard( + cardId: String?, + allowRequestAccessCodeFromStorage: Boolean, + shouldCheckIsAlreadyActivated: Boolean, + ): ScanResponse } \ No newline at end of file diff --git a/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt b/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt index 6e840ea584..ac00b3703e 100644 --- a/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt +++ b/features/create-wallet-start/impl/src/main/kotlin/com/tangem/features/createwalletstart/CreateWalletStartModel.kt @@ -186,6 +186,7 @@ internal class CreateWalletStartModel @Inject constructor( scanCardProcessor.scan( analyticsSource = analyticsSource, + shouldCheckIsAlreadyActivated = true, onProgressStateChange = { showProgress -> if (!showProgress) { delay(HIDE_PROGRESS_DELAY) diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/UserWalletSaver.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/UserWalletSaver.kt index 1db2f97cc0..3e81799932 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/UserWalletSaver.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/UserWalletSaver.kt @@ -120,6 +120,7 @@ internal class UserWalletSaver @Inject constructor( scope.launch { scanCardProcessor.scan( analyticsSource = AnalyticsParam.ScreensSources.Settings, + shouldCheckIsAlreadyActivated = true, onWalletNotCreated = { continuation.resume(Either.Right(null)) }, diff --git a/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt b/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt index 767f2d00ec..7cb91f3880 100644 --- a/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt +++ b/features/home/impl/src/main/kotlin/com/tangem/features/home/impl/model/HomeModel.kt @@ -171,6 +171,7 @@ internal class HomeModel @Inject constructor( scanCardProcessor.scan( analyticsSource = analyticsSource, + shouldCheckIsAlreadyActivated = true, onProgressStateChange = { showProgress -> if (!showProgress) { delay(HIDE_PROGRESS_DELAY) diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt index 5d32c8952b..49c8bc6351 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createhardwarewallet/CreateHardwareWalletModel.kt @@ -104,6 +104,7 @@ internal class CreateHardwareWalletModel @Inject constructor( scanCardProcessor.scan( analyticsSource = analyticsSource, + shouldCheckIsAlreadyActivated = true, onProgressStateChange = { showProgress -> if (!showProgress) { delay(HIDE_PROGRESS_DELAY) diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt index c7252d49c4..3d8d7bc0bd 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt @@ -115,7 +115,7 @@ internal class UpgradeWalletModel @Inject constructor( ) tangemSdkManager - .scanProduct() + .scanProduct(shouldCheckIsAlreadyActivated = true) .doOnSuccess { scanResponse -> checkIsWalletSuitableToBeUsedAsUpgrade(scanResponse = scanResponse) { delay(DELAY_SDK_DIALOG_CLOSE) diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt index 3146309d54..7e3ef9caeb 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt @@ -9,9 +9,7 @@ import com.squareup.moshi.Moshi import com.tangem.blockchain.common.Approver import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token -import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow @@ -25,7 +23,6 @@ import com.tangem.datasource.api.express.models.response.TxDetails import com.tangem.datasource.crypto.DataSignatureVerifier import com.tangem.datasource.exchangeservice.swap.ExpressUtils import com.tangem.datasource.local.preferences.AppPreferencesStore -import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.exchange.RampStateManager import com.tangem.domain.express.models.ExpressOperationType import com.tangem.domain.models.currency.CryptoCurrency @@ -53,19 +50,16 @@ internal class DefaultSwapRepository( private val tangemExpressApi: TangemExpressApi, private val coroutineDispatcher: CoroutineDispatcherProvider, private val walletManagersFacade: WalletManagersFacade, - private val userWalletsListRepository: UserWalletsListRepository, private val errorsDataConverter: ErrorsDataConverter, private val dataSignatureVerifier: DataSignatureVerifier, private val appPreferencesStore: AppPreferencesStore, private val rampStateManager: RampStateManager, moshi: Moshi, - excludedBlockchains: ExcludedBlockchains, ) : SwapRepository { private val expressDataConverter = ExpressDataConverter() private val leastTokenInfoConverter = LeastTokenInfoConverter() private val swapPairInfoConverter = SwapPairInfoConverter() - private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains) private val exchangeStatusConverter = ExchangeStatusConverter() private val txDetailsMoshiAdapter = moshi.adapter(TxDetails::class.java) @@ -445,18 +439,6 @@ internal class DefaultSwapRepository( ) } - override suspend fun getNativeTokenForNetwork(networkId: String): CryptoCurrency { - val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - - return requireNotNull( - cryptoCurrencyFactory.createCoin( - blockchain = blockchain, - extraDerivationPath = null, - userWallet = requireNotNull(userWalletsListRepository.selectedUserWalletSync()), - ), - ) - } - private fun getDataError(ex: Exception): ExpressDataError { return if (ex is ApiResponseError.HttpException) { errorsDataConverter.convert(ex.errorBody.orEmpty()) diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index 91ff6e2f27..669ba6fcd4 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -1,7 +1,6 @@ package com.tangem.feature.swap.di import com.squareup.moshi.Moshi -import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory import com.tangem.data.common.network.NetworkFactory import com.tangem.datasource.api.express.TangemExpressApi @@ -11,7 +10,6 @@ import com.tangem.datasource.di.NetworkMoshi import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.account.supplier.SingleAccountListSupplier -import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.exchange.RampStateManager import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.feature.swap.DefaultSwapRepository @@ -37,10 +35,8 @@ internal class SwapDataModule { coroutineDispatcher: CoroutineDispatcherProvider, dataSignature: DataSignatureVerifier, walletManagerFacade: WalletManagersFacade, - userWalletsListRepository: UserWalletsListRepository, errorsDataConverter: ErrorsDataConverter, @NetworkMoshi moshi: Moshi, - excludedBlockchains: ExcludedBlockchains, appPreferencesStore: AppPreferencesStore, rampStateManager: RampStateManager, ): SwapRepository { @@ -48,11 +44,9 @@ internal class SwapDataModule { tangemExpressApi = tangemExpressApi, coroutineDispatcher = coroutineDispatcher, walletManagersFacade = walletManagerFacade, - userWalletsListRepository = userWalletsListRepository, errorsDataConverter = errorsDataConverter, dataSignatureVerifier = dataSignature, moshi = moshi, - excludedBlockchains = excludedBlockchains, appPreferencesStore = appPreferencesStore, rampStateManager = rampStateManager, ) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt index 244a784b00..c1193cdb4c 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt @@ -6,6 +6,7 @@ import com.tangem.domain.express.models.ExpressOperationType import com.tangem.domain.models.account.Account import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus +import com.tangem.domain.models.network.Network import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.transaction.error.GetFeeError import com.tangem.domain.transaction.models.TransactionFeeExtended @@ -123,7 +124,7 @@ interface SwapInteractor { isReverseFromTo: Boolean, ): AccountSwapCurrency? - suspend fun getNativeToken(networkId: String): CryptoCurrency + suspend fun getNativeToken(network: Network): CryptoCurrency @Suppress("LongParameterList") suspend fun storeSwapTransaction( diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index cbaa2d6509..c3793db861 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -1355,8 +1355,13 @@ internal class SwapInteractorImpl @AssistedInject constructor( } } - override suspend fun getNativeToken(networkId: String): CryptoCurrency { - return repository.getNativeTokenForNetwork(networkId) + override suspend fun getNativeToken(network: Network): CryptoCurrency { + return multiWalletCryptoCurrenciesSupplier.getSyncOrNull( + params = MultiWalletCryptoCurrenciesProducer.Params(userWalletId), + ) + ?.filterIsInstance() + ?.firstOrNull { it.network.id == network.id && it.network.derivationPath == network.derivationPath } + ?: error("Unable to create network coin with ID: ${network.id}") } private suspend fun isAllowedToSpend( @@ -1505,7 +1510,6 @@ internal class SwapInteractorImpl @AssistedInject constructor( return quoteDataModel.fold( ifRight = { quoteModel -> val swapState = updateBalances( - networkId = networkId, fromTokenStatus = fromToken, fromAccount = fromAccount, toTokenStatus = toToken, @@ -1753,10 +1757,12 @@ internal class SwapInteractorImpl @AssistedInject constructor( } else -> { if (feeValue < amount.value) { + val nativeCoinDecimals = Blockchain.fromNetworkId(networkId)?.decimals() + ?: error("Blockchain not found") IncludeFeeInAmount.Included( amountSubtractFee = SwapAmount( reducedBalance - feeValue, - getNativeToken(fromToken.network.backendId).decimals, + nativeCoinDecimals, ), ) } else { @@ -1773,7 +1779,7 @@ internal class SwapInteractorImpl @AssistedInject constructor( ) val feeCurrencyId: CryptoCurrency.ID = when (feePaidCurrency) { is FeePaidCurrency.Token -> feePaidCurrency.tokenId - else -> getNativeToken(networkId = fromToken.network.backendId).id + else -> getNativeToken(network = fromToken.network).id } val rates = getQuotes(feeCurrencyId) return rates[feeCurrencyId]?.let { rate -> @@ -1869,7 +1875,6 @@ internal class SwapInteractorImpl @AssistedInject constructor( includeFeeInAmount = includeFeeInAmount, ) val swapState = updateBalances( - networkId = networkId, fromTokenStatus = fromToken, fromAccount = fromAccount, toTokenStatus = toToken, @@ -2037,7 +2042,6 @@ internal class SwapInteractorImpl @AssistedInject constructor( @Suppress("LongParameterList", "MaxChainedCallsOnSameLine") private suspend fun updateBalances( provider: SwapProvider, - networkId: String, fromTokenStatus: CryptoCurrencyStatus, fromAccount: Account.CryptoPortfolio?, toTokenStatus: CryptoCurrencyStatus, @@ -2049,7 +2053,7 @@ internal class SwapInteractorImpl @AssistedInject constructor( ): SwapState.QuotesLoadedState { val fromToken = fromTokenStatus.currency val toToken = toTokenStatus.currency - val nativeToken = repository.getNativeTokenForNetwork(networkId) + val nativeToken = getNativeToken(fromToken.network) val rates = getQuotes(fromToken.id, toToken.id, nativeToken.id) return SwapState.QuotesLoadedState( fromTokenInfo = TokenSwapInfo( @@ -2478,7 +2482,7 @@ internal class SwapInteractorImpl @AssistedInject constructor( if (balanceToCheck > fee.multiply(percentsToFeeIncrease)) { SwapFeeState.Enough } else { - val nativeToken = getNativeToken(fromTokenStatus.currency.network.backendId) + val nativeToken = getNativeToken(fromTokenStatus.currency.network) SwapFeeState.NotEnough( feeCurrency = nativeToken, currencyName = nativeToken.network.name, @@ -2522,11 +2526,10 @@ internal class SwapInteractorImpl @AssistedInject constructor( } } is FeePaidCurrency.FeeResource -> { - val network = repository.getNativeTokenForNetwork(networkId).network val isFeeResourceEnough = currencyChecksRepository.checkIfFeeResourceEnough( amount = spendAmount.value, userWalletId = userWalletId, - network = network, + network = fromTokenStatus.currency.network, ) if (isFeeResourceEnough) { diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/api/SwapRepository.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/api/SwapRepository.kt index a23260fb53..c9ba429d75 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/api/SwapRepository.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/api/SwapRepository.kt @@ -83,6 +83,4 @@ interface SwapRepository { txHash: String, payInExtraId: String?, ): Either - - suspend fun getNativeTokenForNetwork(networkId: String): CryptoCurrency } \ No newline at end of file diff --git a/features/welcome/impl/src/main/kotlin/com/tangem/features/welcome/impl/model/WelcomeModel.kt b/features/welcome/impl/src/main/kotlin/com/tangem/features/welcome/impl/model/WelcomeModel.kt index 3aa198a9d7..5c16293dd7 100644 --- a/features/welcome/impl/src/main/kotlin/com/tangem/features/welcome/impl/model/WelcomeModel.kt +++ b/features/welcome/impl/src/main/kotlin/com/tangem/features/welcome/impl/model/WelcomeModel.kt @@ -192,6 +192,7 @@ internal class WelcomeModel @Inject constructor( modelScope.launch { scanCardProcessor.scan( analyticsSource = AnalyticsParam.ScreensSources.SignIn, + shouldCheckIsAlreadyActivated = true, onWalletNotCreated = {}, disclaimerWillShow = { router.pop() }, onSuccess = { scanResponse -> diff --git a/libs/tangem-sdk-api/src/main/kotlin/com/tangem/sdk/api/TangemSdkManager.kt b/libs/tangem-sdk-api/src/main/kotlin/com/tangem/sdk/api/TangemSdkManager.kt index 64016c2cf8..a7697062bd 100644 --- a/libs/tangem-sdk-api/src/main/kotlin/com/tangem/sdk/api/TangemSdkManager.kt +++ b/libs/tangem-sdk-api/src/main/kotlin/com/tangem/sdk/api/TangemSdkManager.kt @@ -45,10 +45,18 @@ interface TangemSdkManager { suspend fun checkNeedEnrollBiometrics(awaitInitialization: Boolean = true): Boolean + /** + * Scans the card and returns [ScanResponse] with the card information. + * If [cardId] is provided, it will try to find the card with this ID in the card reader's range. + * If [allowsRequestAccessCodeFromRepository] is true, it will try to request access code from the repository + * if the card is protected by access code and the access code is not saved in the repository. + * If [shouldCheckIsAlreadyActivated] is true, it will check if the card is already activated and return an error if it is. + */ suspend fun scanProduct( cardId: String? = null, messageRes: Int? = null, allowsRequestAccessCodeFromRepository: Boolean = false, + shouldCheckIsAlreadyActivated: Boolean, ): CompletionResult suspend fun createProductWallet(