diff --git a/.gitignore b/.gitignore index a4d9c4c73d..7f43fa6dc1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ **/build/kotlin/** **/build/libs/** **/build/outputs/** +**/build/reports/** **/build/tmp/** # Local configuration file (sdk path, etc) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index ad46a043f9..5cf863d2ad 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit ad46a043f9b98b4f4577f906920532cb370c15d4 +Subproject commit 5cf863d2ad68d89a111520aca3504fe9db234c82 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 3a63ffb6a8..64dbe9c954 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 @@ -143,10 +143,8 @@ internal object TransactionDomainModule { @Provides @Singleton - fun provideIsUtxoConsolidationAvailableUseCase( - walletManagersFacade: WalletManagersFacade, - ): IsUtxoConsolidationAvailableUseCase { - return IsUtxoConsolidationAvailableUseCase(walletManagersFacade) + fun provideIsSelfSendAvailableUseCase(walletManagersFacade: WalletManagersFacade): IsSelfSendAvailableUseCase { + return IsSelfSendAvailableUseCase(walletManagersFacade) } @Provides 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 711bf35291..6a91513972 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 @@ -57,7 +57,7 @@ }, { "name": "NEW_ONRAMP_MAIN_ENABLED", - "version": "5.29.0" + "version": "undefined" }, { "name": "ACCOUNTS_FEATURE_ENABLED", diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromotionInfoResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt similarity index 95% rename from core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromotionInfoResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt index 668a77c321..90caaabe5a 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromotionInfoResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt @@ -4,7 +4,7 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -data class PromotionInfoResponse( +data class PromoBannerResponse( @Json(name = "name") val name: String, @Json(name = "all") val bannerState: BannerState?, ) { diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt index d173c69c57..3b08465384 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt @@ -1,6 +1,7 @@ package com.tangem.datasource.api.tangemTech import com.tangem.datasource.api.common.response.ApiResponse +import com.tangem.datasource.api.promotion.models.PromoBannerResponse import com.tangem.datasource.api.promotion.models.StoryContentResponse import com.tangem.datasource.api.tangemTech.models.* import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse @@ -163,4 +164,12 @@ interface TangemTechApi { @Header("If-None-Match") eTag: String? = null, ): ApiResponse // endregion + + // region promo banners + @GET("/v1/promotion") + suspend fun getPromoBanner( + @Query("programName") name: String, + @Header("Cache-Control") cacheControl: String = "max-age=600", + ): ApiResponse + // endregion } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt index e786b22f21..6d392c4e90 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt @@ -11,6 +11,10 @@ import com.tangem.datasource.local.onramp.paymentmethods.DefaultOnrampPaymentMet import com.tangem.datasource.local.onramp.paymentmethods.OnrampPaymentMethodsStore import com.tangem.datasource.local.onramp.quotes.DefaultOnrampQuotesStore import com.tangem.datasource.local.onramp.quotes.OnrampQuotesStore +import com.tangem.datasource.local.onramp.sepa.DefaultOnrampCurrentCountryByIPStore +import com.tangem.datasource.local.onramp.sepa.DefaultOnrampSepaAvailabilityStore +import com.tangem.datasource.local.onramp.sepa.OnrampCurrentCountryByIPStore +import com.tangem.datasource.local.onramp.sepa.OnrampSepaAvailabilityStore import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -50,4 +54,16 @@ internal object OnrampStoreModule { fun provideOnrampCurrencies(): OnrampCurrenciesStore { return DefaultOnrampCurrenciesStore(dataStore = RuntimeDataStore()) } + + @Provides + @Singleton + fun provideOnrampSepaAvailableStore(): OnrampSepaAvailabilityStore { + return DefaultOnrampSepaAvailabilityStore(dataStore = RuntimeDataStore()) + } + + @Provides + @Singleton + fun provideOnrampCurrentCountryByIPStore(): OnrampCurrentCountryByIPStore { + return DefaultOnrampCurrentCountryByIPStore(dataStore = RuntimeDataStore()) + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/config/environment/converter/BlockchainSDKConfigConverter.kt b/core/datasource/src/main/java/com/tangem/datasource/local/config/environment/converter/BlockchainSDKConfigConverter.kt index c19f0204c0..cc0be2459f 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/config/environment/converter/BlockchainSDKConfigConverter.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/config/environment/converter/BlockchainSDKConfigConverter.kt @@ -44,6 +44,7 @@ internal object BlockchainSDKConfigConverter : Converter, +) : OnrampCurrentCountryByIPStore, StringKeyDataStoreDecorator( + wrappedDataStore = dataStore, +) { + + override suspend fun getSyncOrNull(): OnrampCountry? { + return getSyncOrNull(Unit) + } + + override suspend fun store(value: OnrampCountry) { + return store(Unit, value) + } + + override fun provideStringKey(key: Unit) = "KEY" +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/DefaultOnrampSepaAvailabilityStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/DefaultOnrampSepaAvailabilityStore.kt new file mode 100644 index 0000000000..9e8c14dff4 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/DefaultOnrampSepaAvailabilityStore.kt @@ -0,0 +1,20 @@ +package com.tangem.datasource.local.onramp.sepa + +import com.tangem.datasource.local.datastore.core.StringKeyDataStore +import com.tangem.datasource.local.datastore.core.StringKeyDataStoreDecorator + +internal class DefaultOnrampSepaAvailabilityStore( + val dataStore: StringKeyDataStore, +) : OnrampSepaAvailabilityStore, StringKeyDataStoreDecorator( + wrappedDataStore = dataStore, +) { + override fun provideStringKey(key: OnrampSepaAvailabilityStoreKey) = with(key) { + buildString { + append(userWallet.walletId.toString()) + append("_") + append(country.code) + append("_") + append(cryptoCurrency.id.value) + } + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampCurrentCountryByIPStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampCurrentCountryByIPStore.kt new file mode 100644 index 0000000000..cf05f2046d --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampCurrentCountryByIPStore.kt @@ -0,0 +1,9 @@ +package com.tangem.datasource.local.onramp.sepa + +import com.tangem.domain.onramp.model.OnrampCountry + +interface OnrampCurrentCountryByIPStore { + suspend fun getSyncOrNull(): OnrampCountry? + suspend fun store(value: OnrampCountry) + suspend fun clear() +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampSepaAvailabilityStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampSepaAvailabilityStore.kt new file mode 100644 index 0000000000..6ae1bd2af0 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampSepaAvailabilityStore.kt @@ -0,0 +1,10 @@ +package com.tangem.datasource.local.onramp.sepa + +import kotlinx.coroutines.flow.Flow + +interface OnrampSepaAvailabilityStore { + suspend fun getSyncOrNull(key: OnrampSepaAvailabilityStoreKey): Boolean? + fun get(key: OnrampSepaAvailabilityStoreKey): Flow + suspend fun store(key: OnrampSepaAvailabilityStoreKey, value: Boolean) + suspend fun clear() +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampSepaAvailabilityStoreKey.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampSepaAvailabilityStoreKey.kt new file mode 100644 index 0000000000..301c4e83ef --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/sepa/OnrampSepaAvailabilityStoreKey.kt @@ -0,0 +1,11 @@ +package com.tangem.datasource.local.onramp.sepa + +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.onramp.model.OnrampCountry + +data class OnrampSepaAvailabilityStoreKey( + val userWallet: UserWallet, + val country: OnrampCountry, + val cryptoCurrency: CryptoCurrency, +) \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt b/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt index 93f5aefdf0..50f8841ef5 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt @@ -27,10 +27,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import com.tangem.core.ui.R import com.tangem.core.ui.components.* import com.tangem.core.ui.components.buttons.common.TangemButtonSize import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resolveAnnotatedReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemTheme @@ -216,7 +218,7 @@ internal fun TextsBlock( SpacerH(height = TangemTheme.dimens.spacing2) } - val subtitleText = subtitle.resolveReference() + val subtitleText = subtitle.resolveAnnotatedReference() if (subtitleText.isNotEmpty()) { Text( text = subtitleText, @@ -459,5 +461,15 @@ private class NotificationConfigProvider : CollectionPreviewParameterProvider { return appPreferencesStore.get( @@ -42,7 +46,11 @@ internal class DefaultPromoRepository( PromoId.Referral -> runCatching { !referralRepository.isReferralParticipant(userWalletId) && shouldShow }.getOrDefault(false) - PromoId.Sepa -> shouldShow + PromoId.Sepa -> { + val isActive = getSepaPromoBanner()?.isActive ?: false + + isActive && shouldShow + } } } } @@ -118,7 +126,16 @@ internal class DefaultPromoRepository( ) } + private suspend fun getSepaPromoBanner(): PromoBanner? { + return runCatching(dispatchers.io) { + promoBannerConverter.convert( + tangemApi.getPromoBanner(SEPA_NAME).getOrThrow(), + ) + }.getOrNull() + } + private companion object { + const val SEPA_NAME = "sepa" const val STORIES_LOAD_DELAY = 1000L } } \ No newline at end of file diff --git a/data/promo/src/main/java/com/tangem/data/promo/converters/PromoResponseConverter.kt b/data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt similarity index 74% rename from data/promo/src/main/java/com/tangem/data/promo/converters/PromoResponseConverter.kt rename to data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt index cc418e808c..1128472f33 100644 --- a/data/promo/src/main/java/com/tangem/data/promo/converters/PromoResponseConverter.kt +++ b/data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt @@ -1,13 +1,13 @@ package com.tangem.data.promo.converters -import com.tangem.datasource.api.promotion.models.PromotionInfoResponse +import com.tangem.datasource.api.promotion.models.PromoBannerResponse import com.tangem.domain.promo.models.PromoBanner import com.tangem.utils.converter.Converter import org.joda.time.DateTime -class PromoResponseConverter : Converter { +class PromoBannerConverter : Converter { - override fun convert(value: PromotionInfoResponse): PromoBanner? { + override fun convert(value: PromoBannerResponse): PromoBanner? { val bannerState = value.bannerState ?: return null return PromoBanner( name = value.name, diff --git a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt index 4999c1b188..bf3dcaa1c9 100644 --- a/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt +++ b/data/wallet-manager/src/main/java/com/tangem/data/walletmanager/DefaultWalletManagersFacade.kt @@ -650,7 +650,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( } } - override suspend fun checkUtxoConsolidationAvailability(userWalletId: UserWalletId, network: Network): Boolean { + override suspend fun checkSelfSendAvailability(userWalletId: UserWalletId, network: Network): Boolean { val blockchain = network.toBlockchain() val walletManager = getOrCreateWalletManager( userWalletId = userWalletId, @@ -658,7 +658,7 @@ internal class DefaultWalletManagersFacade @Inject constructor( derivationPath = network.derivationPath.value, ) ?: return false - return (walletManager as? UtxoBlockchainManager)?.allowConsolidation == true + return walletManager.isSelfSendAvailable } override suspend fun getNFTCollections(userWalletId: UserWalletId, network: Network): List { diff --git a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt index ea544fed18..cbc1107bd4 100644 --- a/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt +++ b/data/yield-supply/src/main/java/com/tangem/data/yield/supply/DefaultYieldSupplyTransactionRepository.kt @@ -83,7 +83,7 @@ internal class DefaultYieldSupplyTransactionRepository( walletManager = walletManager, cryptoCurrency = cryptoCurrency, callData = callData, - destinationAddress = walletManager.getYieldContract(), + destinationAddress = walletManager.getYieldModuleAddress(), amount = BigDecimal.ZERO.convertToSdkAmount(cryptoCurrencyStatus), fee = fee, ) @@ -175,7 +175,7 @@ internal class DefaultYieldSupplyTransactionRepository( blockchain = cryptoCurrency.network.toBlockchain(), derivationPath = cryptoCurrency.network.derivationPath.value, ) ?: error("Wallet manager not found") - walletManager.calculateYieldContract() + walletManager.calculateYieldModuleAddress() }.onFailure(Timber::e).getOrNull() } @@ -188,7 +188,7 @@ internal class DefaultYieldSupplyTransactionRepository( blockchain = cryptoCurrency.network.toBlockchain(), derivationPath = cryptoCurrency.network.derivationPath.value, ) ?: error("Wallet manager not found") - walletManager.getYieldContract() + walletManager.getYieldModuleAddress() }.onFailure(Timber::e).getOrNull() } diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountryUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountryUseCase.kt index c94a29c9a0..cfea2b7626 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountryUseCase.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountryUseCase.kt @@ -26,7 +26,12 @@ class GetOnrampCountryUseCase( } suspend fun invokeSync(userWallet: UserWallet): Either { - return Either.catch { repository.getDefaultCountrySync() ?: repository.getCountryByIp(userWallet) } + return Either.catch { + repository.getDefaultCountrySync() ?: repository.getCountryByIp( + userWallet = userWallet, + fromCache = true, + ) + } .mapLeft(errorResolver::resolve) } } \ No newline at end of file diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/OnrampSepaAvailableUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/OnrampSepaAvailableUseCase.kt index ad7c22bfaa..6fd0b223d9 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/OnrampSepaAvailableUseCase.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/OnrampSepaAvailableUseCase.kt @@ -6,7 +6,6 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.onramp.repositories.OnrampRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.onramp.model.OnrampCountry -import com.tangem.domain.onramp.model.OnrampCurrency class OnrampSepaAvailableUseCase( private val repository: OnrampRepository, @@ -14,7 +13,6 @@ class OnrampSepaAvailableUseCase( suspend operator fun invoke( userWallet: UserWallet, - currency: OnrampCurrency, country: OnrampCountry, cryptoCurrency: CryptoCurrency, ): Boolean { @@ -25,7 +23,6 @@ class OnrampSepaAvailableUseCase( return Either.catch { repository.hasSepaMethod( userWallet = userWallet, - currency = currency, country = country, cryptoCurrency = cryptoCurrency, ) diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt index 2dad8a9e87..268ade4d37 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt @@ -13,14 +13,9 @@ interface OnrampRepository { fun getCurrencies(): Flow> fun getCountries(): Flow> suspend fun getCountriesSync(): List? - suspend fun getCountryByIp(userWallet: UserWallet): OnrampCountry + suspend fun getCountryByIp(userWallet: UserWallet, fromCache: Boolean = false): OnrampCountry suspend fun getStatus(userWallet: UserWallet, txId: String): OnrampStatus - suspend fun hasSepaMethod( - userWallet: UserWallet, - currency: OnrampCurrency, - country: OnrampCountry, - cryptoCurrency: CryptoCurrency, - ): Boolean + suspend fun hasSepaMethod(userWallet: UserWallet, country: OnrampCountry, cryptoCurrency: CryptoCurrency): Boolean suspend fun fetchCurrencies(userWallet: UserWallet) suspend fun fetchCountries(userWallet: UserWallet): List suspend fun fetchPaymentMethodsIfAbsent(userWallet: UserWallet) diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/analytics/StakingAnalyticsEvent.kt b/domain/staking/src/main/java/com/tangem/domain/staking/analytics/StakingAnalyticsEvent.kt index f8376e3707..e46624f635 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/analytics/StakingAnalyticsEvent.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/analytics/StakingAnalyticsEvent.kt @@ -154,6 +154,11 @@ sealed class StakingAnalyticsEvent( data object TransactionError : StakingAnalyticsEvent( event = "Error - Transaction Rejected", ) + + data class UnitializedAddress(val token: String) : StakingAnalyticsEvent( + event = "Notice - Uninitialized Address", + params = mapOf(AnalyticsParam.TOKEN_PARAM to token), + ) } enum class StakeScreenSource { diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/IsUtxoConsolidationAvailableUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/IsSelfSendAvailableUseCase.kt similarity index 74% rename from domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/IsUtxoConsolidationAvailableUseCase.kt rename to domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/IsSelfSendAvailableUseCase.kt index dc8cef03b8..cf602e2959 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/IsUtxoConsolidationAvailableUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/IsSelfSendAvailableUseCase.kt @@ -5,14 +5,14 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.models.wallet.UserWalletId /** - * Gets UTXO consolidation availability + * Gets self send availability */ -class IsUtxoConsolidationAvailableUseCase( +class IsSelfSendAvailableUseCase( private val walletManagersFacade: WalletManagersFacade, ) { suspend fun invokeSync(userWalletId: UserWalletId, network: Network) = - walletManagersFacade.checkUtxoConsolidationAvailability( + walletManagersFacade.checkSelfSendAvailability( userWalletId = userWalletId, network = network, ) diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt index f86486cc2c..88413f9891 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/ValidateWalletAddressUseCase.kt @@ -56,12 +56,11 @@ class ValidateWalletAddressUseCase( isCurrentAddress: (String) -> Boolean, ): AddressValidationResult { val decodedXAddress = BlockchainUtils.decodeRippleXAddress(address, network.rawId) - val isUtxoConsolidationAvailable = - walletManagersFacade.checkUtxoConsolidationAvailability(userWalletId, network) + val isSelfSendAvailable = walletManagersFacade.checkSelfSendAvailability(userWalletId, network) val addressToValidate = decodedXAddress?.address ?: address val current = isCurrentAddress(addressToValidate) - val isForbidSelfSend = current && !isUtxoConsolidationAvailable + val isForbidSelfSend = current && !isSelfSendAvailable val isValidAddress = walletAddressServiceRepository.validateAddress(userWalletId, network, addressToValidate) return when { diff --git a/domain/wallet-manager/src/main/kotlin/com/tangem/domain/walletmanager/WalletManagersFacade.kt b/domain/wallet-manager/src/main/kotlin/com/tangem/domain/walletmanager/WalletManagersFacade.kt index 744e98f336..26f486dbb3 100644 --- a/domain/wallet-manager/src/main/kotlin/com/tangem/domain/walletmanager/WalletManagersFacade.kt +++ b/domain/wallet-manager/src/main/kotlin/com/tangem/domain/walletmanager/WalletManagersFacade.kt @@ -243,12 +243,12 @@ interface WalletManagersFacade { suspend fun discardRequirements(userWalletId: UserWalletId, currency: CryptoCurrency): SimpleResult /** - * Indicates UTXO consolidation availability + * Indicates self send availability * * @param userWalletId selected user wallet * @param network availability for network */ - suspend fun checkUtxoConsolidationAvailability(userWalletId: UserWalletId, network: Network): Boolean + suspend fun checkSelfSendAvailability(userWalletId: UserWalletId, network: Network): Boolean suspend fun getNFTCollections(userWalletId: UserWalletId, network: Network): List diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt index 49919e627d..410ac938d0 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt @@ -70,8 +70,11 @@ internal class ManageTokensUiManager( val updatedBatch = uiBatchToUpdate.copy( data = data.mapIndexed { index, item -> - if (item == currencyBatch.data[index]) { - return@mapIndexed uiBatchToUpdate.data[index] + val uiBatch = uiBatchToUpdate.data.getOrNull(index) + if (item == currencyBatch.data.getOrNull(index) && + uiBatch != null + ) { + return@mapIndexed uiBatch } val previousUiItem = uiBatchToUpdate.data.getOrNull(index) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt index 26cc7fab20..efecb19956 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt @@ -63,7 +63,6 @@ internal class OnboardingNoteCreateWalletModel @Inject constructor( when (result) { is CompletionResult.Success -> { Analytics.send(OnboardingEvent.CreateWallet.WalletCreatedSuccessfully()) - cardRepository.startCardActivation(scanResponse.card.cardId) createWalletAndNavigateBackWithDone(scanResponse.copy(card = result.data.card)) } is CompletionResult.Failure -> _uiState.update { diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt index 8d73d20253..c4385c59d6 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt @@ -20,7 +20,7 @@ import com.tangem.domain.qrscanning.usecases.ListenToQrScanningUseCase import com.tangem.domain.qrscanning.usecases.ParseQrCodeUseCase import com.tangem.domain.tokens.GetCryptoCurrencyUseCase import com.tangem.domain.tokens.GetNetworkAddressesUseCase -import com.tangem.domain.transaction.usecase.IsUtxoConsolidationAvailableUseCase +import com.tangem.domain.transaction.usecase.IsSelfSendAvailableUseCase import com.tangem.domain.transaction.usecase.ValidateWalletAddressUseCase import com.tangem.domain.transaction.usecase.ValidateWalletMemoUseCase import com.tangem.domain.txhistory.usecase.GetFixedTxHistoryItemsUseCase @@ -62,7 +62,7 @@ internal class SendDestinationModel @Inject constructor( private val getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase, private val getNetworkAddressesUseCase: GetNetworkAddressesUseCase, private val getFixedTxHistoryItemsUseCase: GetFixedTxHistoryItemsUseCase, - private val isUtxoConsolidationAvailableUseCase: IsUtxoConsolidationAvailableUseCase, + private val isSelfSendAvailableUseCase: IsSelfSendAvailableUseCase, private val listenToQrScanningUseCase: ListenToQrScanningUseCase, private val parseQrCodeUseCase: ParseQrCodeUseCase, private val analyticsEventHandler: AnalyticsEventHandler, @@ -197,7 +197,7 @@ internal class SendDestinationModel @Inject constructor( waitForDelay(RECENT_LOAD_DELAY) { it } }.conflate(), ) { destinationWalletList, txHistoryList -> - val isUtxoConsolidationAvailable = isUtxoConsolidationAvailableUseCase.invokeSync( + val isSelfSendAvailable = isSelfSendAvailableUseCase.invokeSync( userWalletId = userWalletId, network = cryptoCurrency.network, ) @@ -206,7 +206,7 @@ internal class SendDestinationModel @Inject constructor( SendDestinationRecentListTransformer( cryptoCurrency = cryptoCurrency, senderAddress = senderAddresses.value.firstOrNull()?.address, - isUtxoConsolidationAvailable = isUtxoConsolidationAvailable, + isSelfSendAvailable = isSelfSendAvailable, destinationWalletList = destinationWalletList, txHistoryList = txHistoryList, ), diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/converters/SendRecipientWalletListConverter.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/converters/SendRecipientWalletListConverter.kt index 7eb6244a95..67b3584c57 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/converters/SendRecipientWalletListConverter.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/converters/SendRecipientWalletListConverter.kt @@ -13,7 +13,7 @@ import kotlinx.collections.immutable.toPersistentList internal class SendRecipientWalletListConverter( private val senderAddress: String?, - private val isUtxoConsolidationAvailable: Boolean, + private val isSelfSendAvailable: Boolean, ) : Converter, PersistentList> { override fun convert(value: List): PersistentList { @@ -31,7 +31,7 @@ internal class SendRecipientWalletListConverter( val isNotSameAddress = it.address != senderAddress val isNotBlankAddress = it.address.isNotBlank() - isNotBlankAddress && isCoin && (isNotSameAddress || isUtxoConsolidationAvailable) + isNotBlankAddress && isCoin && (isNotSameAddress || isSelfSendAvailable) } .groupBy { item -> item.name } .values.map { wallets -> diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/transformers/SendDestinationRecentListTransformer.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/transformers/SendDestinationRecentListTransformer.kt index aaa18babfe..c1c579cbd8 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/transformers/SendDestinationRecentListTransformer.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/transformers/SendDestinationRecentListTransformer.kt @@ -11,7 +11,7 @@ import com.tangem.utils.transformer.Transformer internal class SendDestinationRecentListTransformer( private val senderAddress: String?, private val cryptoCurrency: CryptoCurrency, - private val isUtxoConsolidationAvailable: Boolean, + private val isSelfSendAvailable: Boolean, private val destinationWalletList: List, private val txHistoryList: List, ) : Transformer { @@ -21,7 +21,7 @@ internal class SendDestinationRecentListTransformer( return state.copy( wallets = SendRecipientWalletListConverter( senderAddress = senderAddress, - isUtxoConsolidationAvailable = isUtxoConsolidationAvailable, + isSelfSendAvailable = isSelfSendAvailable, ).convert(destinationWalletList), recent = SendRecipientHistoryListConverter( cryptoCurrency = cryptoCurrency, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt index 565e045798..90ebda1c8b 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt @@ -261,6 +261,9 @@ internal class StakingModel @Inject constructor( return@launch } isInitialInfoStep && noBalanceState && !isAccountInitialized -> { + analyticsEventHandler.send(StakingAnalyticsEvent.UnitializedAddress( + token = cryptoCurrencyStatus.currency.symbol, + )) stakingEventFactory.createInitializeAccountAlert() return@launch } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt index fa7d183dce..9caba26d83 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt @@ -278,7 +278,6 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( val isSepaAvailable = onrampSepaAvailableUseCase( userWallet = userWallet, country = country, - currency = country.defaultCurrency, cryptoCurrency = bitcoinCurrency, ) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index fa358b8aed..6ec0d318ac 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,7 +5,7 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "develop-1236" +tangemBlockchainSdk = "develop-1240" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-564" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^