From bc001987977a5d0ef942117f1f5d50295cce51b6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 1 Apr 2024 17:38:36 +0100 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/common/extensions/WalletManager.kt | 6 ++--- .../note/redux/OnboardingNoteMiddleware.kt | 9 ++++++- .../twins/redux/TwinCardsMiddleware.kt | 10 +++++++- .../middlewares/TradeCryptoMiddleware.kt | 6 ++--- .../exchangeServices/BuyExchangeService.kt | 8 +++--- .../CurrencyExchangeManager.kt | 9 +++---- .../exchangeServices/ExchangeService.kt | 8 +++--- .../mercuryo/MercuryoService.kt | 9 ++++--- .../moonpay/MoonPayService.kt | 25 +++++++++++++++---- 9 files changed, 57 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt index 11c26259ee..f4df731c74 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/WalletManager.kt @@ -6,6 +6,7 @@ import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.AddressType import com.tangem.common.services.Result import com.tangem.domain.common.extensions.amountToCreateAccount +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.common.TestActions import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder import com.tangem.tap.domain.TapError @@ -58,14 +59,13 @@ suspend fun WalletManager.safeUpdate(isDemoCard: Boolean): Result = try } } -internal fun WalletManager.getTopUpUrl(): String? { +internal fun WalletManager.getTopUpUrl(cryptoCurrency: CryptoCurrency): String? { val globalState = store.state.globalState val defaultAddress = wallet.address return globalState.exchangeManager.getUrl( action = CurrencyExchangeManager.Action.Buy, - blockchain = wallet.blockchain, - cryptoCurrencyName = wallet.blockchain.currency, + cryptoCurrency = cryptoCurrency, fiatCurrencyName = globalState.appCurrency.code, walletAddress = defaultAddress, isDarkTheme = MutableAppThemeModeHolder.isDarkThemeActive, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index 114dedc7df..ca78c542d3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -4,8 +4,10 @@ import com.tangem.common.CompletionResult import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.NavigationAction +import com.tangem.data.tokens.utils.CryptoCurrencyFactory import com.tangem.domain.common.extensions.makePrimaryWalletManager import com.tangem.domain.common.extensions.withMainContext +import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.entities.ProgressState @@ -171,8 +173,13 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch return } - val topUpUrl = walletManager.getTopUpUrl() ?: return val blockchain = walletManager.wallet.blockchain + val cryptoCurrency = CryptoCurrencyFactory().createCoin( + blockchain, + null, + scanResponse.derivationStyleProvider, + ) ?: return + val topUpUrl = walletManager.getTopUpUrl(cryptoCurrency) ?: return val currencyType = AnalyticsParam.CurrencyType.Blockchain(blockchain) Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index c2fc60baaa..e973dae678 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -6,8 +6,10 @@ import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction +import com.tangem.data.tokens.utils.CryptoCurrencyFactory import com.tangem.domain.common.extensions.makePrimaryWalletManager import com.tangem.domain.common.extensions.withMainContext +import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.userwallets.UserWalletIdBuilder @@ -293,8 +295,14 @@ private fun handle(action: Action, dispatch: DispatchFunction) { return } - val topUpUrl = walletManager.getTopUpUrl() ?: return + val scanResponse = onboardingManager?.scanResponse ?: return val blockchain = walletManager.wallet.blockchain + val cryptoCurrency = CryptoCurrencyFactory().createCoin( + blockchain, + null, + scanResponse.derivationStyleProvider, + ) ?: return + val topUpUrl = walletManager.getTopUpUrl(cryptoCurrency) ?: return val currencyType = AnalyticsParam.CurrencyType.Blockchain(blockchain) Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType)) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index a76ae2c37e..aa15f116e8 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -87,8 +87,7 @@ object TradeCryptoMiddleware { val exchangeManager = store.state.globalState.exchangeManager val topUrl = exchangeManager.getUrl( action = CurrencyExchangeManager.Action.Buy, - blockchain = blockchain, - cryptoCurrencyName = currency.symbol, + cryptoCurrency = currency, fiatCurrencyName = action.appCurrencyCode, walletAddress = networkAddress, isDarkTheme = MutableAppThemeModeHolder.isDarkThemeActive, @@ -140,8 +139,7 @@ object TradeCryptoMiddleware { store.state.globalState.exchangeManager.getUrl( action = CurrencyExchangeManager.Action.Sell, - blockchain = Blockchain.fromId(currency.network.id.value), - cryptoCurrencyName = currency.symbol, + cryptoCurrency = currency, fiatCurrencyName = action.appCurrencyCode, walletAddress = networkAddress, isDarkTheme = MutableAppThemeModeHolder.isDarkThemeActive, diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/BuyExchangeService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/BuyExchangeService.kt index 5f48db2717..e6c523e666 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/BuyExchangeService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/BuyExchangeService.kt @@ -1,6 +1,6 @@ package com.tangem.tap.network.exchangeServices -import com.tangem.blockchain.common.Blockchain +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.domain.model.Currency import com.tangem.tap.network.exchangeServices.mercuryo.MercuryoService import com.tangem.tap.scope @@ -38,16 +38,14 @@ internal class BuyExchangeService( override fun getUrl( action: CurrencyExchangeManager.Action, - blockchain: Blockchain, - cryptoCurrencyName: String, + cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, ): String? { return currentService.getUrl( action, - blockchain, - cryptoCurrencyName, + cryptoCurrency, fiatCurrencyName, walletAddress, isDarkTheme, diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt index 1f0dc4ea68..e962f7ebf4 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CurrencyExchangeManager.kt @@ -8,9 +8,9 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.blockchain.extensions.Result import com.tangem.domain.models.scan.CardDTO +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.common.extensions.inject import com.tangem.tap.common.extensions.safeUpdate -import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TangemSigner import com.tangem.tap.domain.model.Currency @@ -48,19 +48,18 @@ class CurrencyExchangeManager( override fun getUrl( action: Action, - blockchain: Blockchain, - cryptoCurrencyName: CryptoCurrencyName, + cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, ): String? { + val blockchain = Blockchain.fromId(cryptoCurrency.network.id.value) if (blockchain.isTestnet()) return blockchain.getTestnetTopUpUrl() val urlBuilder = getExchangeUrlBuilder(action) return urlBuilder.getUrl( action, - blockchain, - cryptoCurrencyName, + cryptoCurrency, fiatCurrencyName, walletAddress, isDarkTheme, diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt index c3f3587c26..e9b17488e3 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/ExchangeService.kt @@ -1,6 +1,6 @@ package com.tangem.tap.network.exchangeServices -import com.tangem.blockchain.common.Blockchain +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.common.feature.Feature import com.tangem.tap.domain.model.Currency @@ -24,8 +24,7 @@ interface ExchangeService : Feature, Exchanger, ExchangeUrlBuilder { override fun availableForSell(currency: Currency): Boolean = false override fun getUrl( action: CurrencyExchangeManager.Action, - blockchain: Blockchain, - cryptoCurrencyName: String, + cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, @@ -56,8 +55,7 @@ interface ExchangeUrlBuilder { @Suppress("LongParameterList") fun getUrl( action: CurrencyExchangeManager.Action, - blockchain: Blockchain, - cryptoCurrencyName: String, + cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt index be796e98e7..d653e2babe 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/mercuryo/MercuryoService.kt @@ -6,7 +6,7 @@ import com.tangem.common.extensions.calculateSha512 import com.tangem.common.extensions.toHexString import com.tangem.common.services.Result import com.tangem.common.services.performRequest -import com.tangem.tap.common.redux.global.CryptoCurrencyName +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.domain.model.Currency import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.network.exchangeServices.ExchangeService @@ -57,20 +57,21 @@ internal class MercuryoService(private val environment: MercuryoEnvironment) : E override fun getUrl( action: CurrencyExchangeManager.Action, - blockchain: Blockchain, - cryptoCurrencyName: CryptoCurrencyName, + cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, ): String { if (action == CurrencyExchangeManager.Action.Sell) throw UnsupportedOperationException() + val blockchain = Blockchain.fromId(cryptoCurrency.network.id.value) + val builder = Uri.Builder() .scheme(ExchangeUrlBuilder.SCHEME) .authority("exchange.mercuryo.io") .appendQueryParameter("widget_id", environment.widgetId) .appendQueryParameter("type", action.name.lowercase()) - .appendQueryParameter("currency", cryptoCurrencyName) + .appendQueryParameter("currency", cryptoCurrency.symbol) .appendQueryParameter("address", walletAddress) .appendQueryParameter("signature", signature(walletAddress)) .appendQueryParameter("fix_currency", "true") diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt index 3e5a70b2a2..228273c9bd 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/moonpay/MoonPayService.kt @@ -7,7 +7,7 @@ import com.tangem.common.services.Result import com.tangem.common.services.performRequest import com.tangem.datasource.api.common.createRetrofitInstance import com.tangem.domain.common.extensions.withIOContext -import com.tangem.tap.common.redux.global.CryptoCurrencyName +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.domain.model.Currency import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.network.exchangeServices.ExchangeService @@ -51,6 +51,7 @@ class MoonPayService( checkGeneralRequirements(currency) && checkUSARequirements(userStatus, currency) } .mapNotNull { currency -> + if (!currency.isSellSupported) return@mapNotNull null MoonPayAvailableCurrency( currencyCode = currency.code, networkCode = currency.metadata?.networkCode ?: return@mapNotNull null, @@ -106,19 +107,33 @@ class MoonPayService( override fun getUrl( action: CurrencyExchangeManager.Action, - blockchain: Blockchain, - cryptoCurrencyName: CryptoCurrencyName, + cryptoCurrency: CryptoCurrency, fiatCurrencyName: String, walletAddress: String, isDarkTheme: Boolean, - ): String { + ): String? { if (action == CurrencyExchangeManager.Action.Buy) throw UnsupportedOperationException() + val blockchain = Blockchain.fromId(cryptoCurrency.network.id.value) + val supportedCurrency = blockchain.moonPaySupportedCurrency ?: return null + val moonpayCurrency = status?.availableForSell?.firstOrNull { + when (cryptoCurrency) { + is CryptoCurrency.Coin -> { + it.networkCode.equals(other = supportedCurrency.networkCode, ignoreCase = true) && + it.currencyCode.equals(other = supportedCurrency.currencyCode, ignoreCase = true) + } + is CryptoCurrency.Token -> { + it.networkCode.equals(other = supportedCurrency.networkCode, ignoreCase = true) && + it.contractAddress.equals(other = cryptoCurrency.contractAddress, ignoreCase = true) + } + } + } ?: return null + val uri = Uri.Builder() .scheme(SCHEME) .authority(URL_SELL) .appendQueryParameter("apiKey", apiKey) - .appendQueryParameter("baseCurrencyCode", cryptoCurrencyName) + .appendQueryParameter("baseCurrencyCode", moonpayCurrency.currencyCode.uppercase()) .appendQueryParameter("refundWalletAddress", walletAddress) .appendQueryParameter("redirectURL", "tangem://redirect_sell")