From 939f6e87b6e1746fd9de68a24cf03c423e9bad3a Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 3 Nov 2021 16:42:43 +0300 Subject: [PATCH 1/2] Updated on 2026-08-14 --- .../tap/common/redux/global/GlobalAction.kt | 6 +- .../common/redux/global/GlobalMidlleware.kt | 8 +- .../tap/common/redux/global/GlobalReducer.kt | 16 +++- .../tap/common/redux/global/GlobalState.kt | 4 +- .../com/tangem/tap/domain/TapWalletManager.kt | 14 +--- .../tap/domain/topup/TradeCryptoHelper.kt | 9 --- .../tap/features/home/redux/HomeMiddleware.kt | 2 +- .../note/redux/OnboardingNoteState.kt | 2 +- .../products/twins/redux/TwinCardsState.kt | 2 +- .../tap/features/wallet/redux/WalletAction.kt | 3 +- .../tap/features/wallet/redux/WalletState.kt | 8 -- .../middlewares/MultiWalletMiddleware.kt | 6 +- .../redux/reducers/MultiWalletReducer.kt | 15 ---- .../wallet/redux/reducers/WalletReducer.kt | 25 +++---- .../wallet/ui/WalletDetailsFragment.kt | 2 - .../tangem/tap/network/moonpay/MoonpayApi.kt | 15 +++- .../tap/network/moonpay/MoonpayService.kt | 73 ++++++++++++++++++- 17 files changed, 129 insertions(+), 81 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 278672bff1..a1e1e7b2b1 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -12,7 +12,7 @@ import com.tangem.tap.domain.tasks.product.ScanResponse import com.tangem.tap.features.details.redux.SecurityOption import com.tangem.tap.features.feedback.EmailData import com.tangem.tap.features.feedback.FeedbackManager -import com.tangem.tap.network.moonpay.MoonPayUserStatus +import com.tangem.tap.network.moonpay.MoonpayStatus import org.rekotlin.Action sealed class GlobalAction : Action { @@ -72,7 +72,7 @@ sealed class GlobalAction : Action { data class SendFeedback(val emailData: EmailData) : GlobalAction() data class UpdateFeedbackInfo(val walletManagers: List) : GlobalAction() - object GetMoonPayUserStatus : GlobalAction() { - data class Success(val moonPayUserStatus: MoonPayUserStatus) : GlobalAction() + object GetMoonPayStatus : GlobalAction() { + data class Success(val moonPayStatus: MoonpayStatus) : GlobalAction() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index 10aa0f1533..20ed9fe34a 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -74,14 +74,14 @@ private val globalMiddlewareHandler: Middleware = { dispatch, appState store.state.globalState.feedbackManager?.infoHolder ?.setWalletsInfo(action.walletManagers) } - is GlobalAction.GetMoonPayUserStatus -> { + is GlobalAction.GetMoonPayStatus -> { val apiKey = appState()?.globalState?.configManager?.config?.moonPayApiKey if (apiKey != null) { scope.launch { - val userStatusResponse = MoonpayService().getUserStatus(apiKey) - if (userStatusResponse is Result.Success) { + val moonpayStatus = MoonpayService().getMoonpayStatus(apiKey) + if (moonpayStatus is Result.Success) { store.dispatchOnMain( - GlobalAction.GetMoonPayUserStatus.Success(userStatusResponse.data) + GlobalAction.GetMoonPayStatus.Success(moonpayStatus.data) ) } } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index f5ce207390..6a633677b8 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -2,6 +2,7 @@ package com.tangem.tap.common.redux.global import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.onboarding.OnboardingManager +import com.tangem.tap.network.moonpay.MoonpayStatus import com.tangem.tap.preferencesStorage import org.rekotlin.Action @@ -66,8 +67,19 @@ fun globalReducer(action: Action, state: AppState): GlobalState { is GlobalAction.HideDialog -> { globalState.copy(dialog = null) } - is GlobalAction.GetMoonPayUserStatus.Success -> { - globalState.copy(moonPayUserStatus = action.moonPayUserStatus) + is GlobalAction.GetMoonPayStatus.Success -> { + val fiatExchangeIsEnabled = globalState.configManager?.config?.isTopUpEnabled ?: false + val moonpayStatus = if (fiatExchangeIsEnabled) { + action.moonPayStatus + } else { + MoonpayStatus( + isBuyAllowed = false, + isSellAllowed = false, + availableToBuy = emptyList(), + availableToSell = emptyList() + ) + } + globalState.copy(moonpayStatus = moonpayStatus) } is GlobalAction.SetIfCardVerifiedOnline -> globalState.copy(cardVerifiedOnline = action.verified) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index e0166e90e8..484142c611 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -10,7 +10,7 @@ import com.tangem.tap.domain.tasks.product.ScanResponse import com.tangem.tap.features.feedback.FeedbackManager import com.tangem.tap.features.onboarding.OnboardingManager import com.tangem.tap.network.coinmarketcap.CoinMarketCapService -import com.tangem.tap.network.moonpay.MoonPayUserStatus +import com.tangem.tap.network.moonpay.MoonpayStatus import org.rekotlin.StateType data class GlobalState( @@ -26,7 +26,7 @@ data class GlobalState( val appCurrency: FiatCurrencyName = DEFAULT_FIAT_CURRENCY, val scanCardFailsCounter: Int = 0, val dialog: StateDialog? = null, - val moonPayUserStatus: MoonPayUserStatus? = null, + val moonpayStatus: MoonpayStatus? = null, val resources: AndroidResources = AndroidResources(), ) : StateType diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt index 7c2ec7f173..f80e7ec763 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -145,11 +145,8 @@ class TapWalletManager { loadMultiWalletData(data.card, blockchain, null) } } - val moonPayUserStatus = store.state.globalState.moonPayUserStatus - store.dispatch(WalletAction.LoadWallet( - allowToBuy = config.isTopUpEnabled && moonPayUserStatus?.isBuyAllowed == true, - allowToSell = config.isTopUpEnabled && moonPayUserStatus?.isSellAllowed == true, - )) + val moonPayStatus = store.state.globalState.moonpayStatus + store.dispatch(WalletAction.LoadWallet(moonPayStatus)) store.dispatch(WalletAction.LoadFiatRate()) } } @@ -212,11 +209,8 @@ class TapWalletManager { } val config = store.state.globalState.configManager?.config ?: return@withContext - val moonpayUserStatus = store.state.globalState.moonPayUserStatus - store.dispatch(WalletAction.LoadWallet( - allowToBuy = config.isTopUpEnabled && moonpayUserStatus?.isBuyAllowed == true, - allowToSell = config.isTopUpEnabled && moonpayUserStatus?.isSellAllowed == true, - )) + val moonPayStatus = store.state.globalState.moonpayStatus + store.dispatch(WalletAction.LoadWallet(moonPayStatus)) store.dispatch(WalletAction.LoadFiatRate()) } } diff --git a/app/src/main/java/com/tangem/tap/domain/topup/TradeCryptoHelper.kt b/app/src/main/java/com/tangem/tap/domain/topup/TradeCryptoHelper.kt index f16a2591b2..c8599f6d4c 100644 --- a/app/src/main/java/com/tangem/tap/domain/topup/TradeCryptoHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/topup/TradeCryptoHelper.kt @@ -38,15 +38,6 @@ class TradeCryptoHelper { private const val TRANSACTION_RECEIPT_PATH = "transaction_receipt?transactionId=" - val AVAILABLE_TO_BUY: Set = setOf( - "ZRX", "AAVE", "ALGO", "AXS", "BAT", "BNB", "BUSD", "BTC", "BCH", "BTT", "ADA", "CELO", "CUSD", "LINK", "CHZ", "COMP", "ATOM", "DAI", "DASH", "MANA", "DGB", "DOGE", "EGLD", - "ENJ", "EOS", "ETC", "ETH", "KETH", "RINKETH", "FIL", "HBAR", "MIOTA", "KAVA", "KLAY", "LBC", "LTC", "LUNA", "MKR", "OM", "MATIC", "NANO", "NEAR", "XEM", "NEO", "NIM", "OKB", - "OMG", "ONG", "ONT", "DOT", "QTUM", "RVN", "RFUEL", "KEY", "SRM", "SOL", "XLM", "STMX", "SNX", "KRT", "UST", "USDT", "XTZ", "RUNE", "SAND", "TOMO", "AVA", "TRX", "TUSD", "UNI", - "USDC", "UTK", "VET", "WAXP", "WBTC", "XRP", "ZEC", "ZIL" - ) - - val AVAILABLE_TO_SELL: Set = setOf("BTC", "ETH", "BCH") - fun getUrl( action: Action, blockchain: Blockchain?, diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index bd5cdcffff..feb775872b 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -37,7 +37,7 @@ private val homeMiddleware: Middleware = { dispatch, state -> when (action) { is HomeAction.Init -> { store.dispatch(GlobalAction.RestoreAppCurrency) - store.dispatch(GlobalAction.GetMoonPayUserStatus) + store.dispatch(GlobalAction.GetMoonPayStatus) store.dispatch(HomeAction.SetTermsOfUseState(preferencesStorage.wasDisclaimerAccepted())) } is HomeAction.ShouldScanCardOnResume -> { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt index 5178c2eb72..c111b83470 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt @@ -26,7 +26,7 @@ data class OnboardingNoteState( get() = steps.indexOf(currentStep) val isBuyAllowed: Boolean by ReadOnlyProperty { thisRef, property -> - store.state.globalState.moonPayUserStatus?.isBuyAllowed ?: false + store.state.globalState.moonpayStatus?.isBuyAllowed ?: false } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt index 7e8cea4f57..84ab30a9d8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt @@ -56,7 +56,7 @@ data class TwinCardsState( get() = currentStep == TwinCardsStep.CreateSecondWallet || currentStep == TwinCardsStep.CreateThirdWallet val isBuyAllowed: Boolean by ReadOnlyProperty { thisRef, property -> - store.state.globalState.moonPayUserStatus?.isBuyAllowed ?: false + store.state.globalState.moonpayStatus?.isBuyAllowed ?: false } } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index ae0a273c14..149550727b 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -9,6 +9,7 @@ import com.tangem.tap.common.redux.NotificationAction import com.tangem.tap.domain.TapError import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.tokens.CardCurrencies +import com.tangem.tap.network.moonpay.MoonpayStatus import com.tangem.wallet.R import org.rekotlin.Action import java.math.BigDecimal @@ -25,7 +26,7 @@ sealed class WalletAction : Action { data class LoadWallet( - val allowToSell: Boolean? = null, val allowToBuy: Boolean? = null, + val moonpayStatus: MoonpayStatus? = null, val blockchain: Blockchain? = null, ) : WalletAction() { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt index e766e87035..042192ae8f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletState.kt @@ -11,7 +11,6 @@ import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.tap.common.toggleWidget.WidgetState import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.extensions.toSendableAmounts -import com.tangem.tap.domain.topup.TradeCryptoHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsState import com.tangem.tap.features.wallet.models.PendingTransaction import com.tangem.tap.features.wallet.models.toPendingTransactions @@ -38,7 +37,6 @@ data class WalletState( val primaryBlockchain: Blockchain? = null, val primaryToken: Token? = null, val isTestnet: Boolean = false, - val tradeCryptoAllowed: TradeCryptoAvailability = TradeCryptoAvailability() ) : StateType { // if you do not delegate - the application crashes on startup, @@ -221,12 +219,6 @@ data class TradeCryptoState( val buyingAllowed: Boolean = false, ) -data class TradeCryptoAvailability( - val sellingAllowed: Boolean = false, - val buyingAllowed: Boolean = false, - val availableToSell: Set = TradeCryptoHelper.AVAILABLE_TO_SELL, -) - data class WalletData( val pendingTransactions: List = emptyList(), val hashesCountVerified: Boolean? = null, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 026cc26e4d..8397f148e0 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -54,7 +54,11 @@ class MultiWalletMiddleware { } } store.dispatch(WalletAction.LoadFiatRate(currency = Currency.Blockchain(action.blockchain))) - store.dispatch(WalletAction.LoadWallet(blockchain = action.blockchain)) + store.dispatch(WalletAction.LoadWallet( + moonpayStatus = globalState?.moonpayStatus, + blockchain = action.blockchain + ) + ) } is WalletAction.MultiWallet.SaveCurrencies -> { val cardId = globalState?.scanResponse?.card?.cardId diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt index 030c2e2ab6..8db9dcf9f8 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt @@ -38,11 +38,6 @@ class MultiWalletReducer { walletAddresses = createAddressList(wallet), mainButton = WalletMainButton.SendButton(false), currency = Currency.Blockchain(blockchain), - tradeCryptoState = TradeCryptoState( - sellingAllowed = state.tradeCryptoAllowed.sellingAllowed && - state.tradeCryptoAllowed.availableToSell.contains(blockchain.currency), - buyingAllowed = state.tradeCryptoAllowed.buyingAllowed - ) ) } @@ -67,11 +62,6 @@ class MultiWalletReducer { walletAddresses = createAddressList(wallet), mainButton = WalletMainButton.SendButton(false), currency = Currency.Blockchain(action.blockchain), - tradeCryptoState = TradeCryptoState( - sellingAllowed = state.tradeCryptoAllowed.sellingAllowed && - state.tradeCryptoAllowed.availableToSell.contains(action.blockchain.currency), - buyingAllowed = state.tradeCryptoAllowed.buyingAllowed - ) ) val newState = state.copy(wallets = state.replaceWalletInWallets(walletData)) if (wallet != null && wallet.amounts[AmountType.Coin]?.value != null) { @@ -173,10 +163,5 @@ fun Token.toWallet(state: WalletState): WalletData? { walletAddresses = walletAddresses, mainButton = WalletMainButton.SendButton(false), currency = Currency.Token(this), - tradeCryptoState = TradeCryptoState( - sellingAllowed = state.tradeCryptoAllowed.sellingAllowed && - state.tradeCryptoAllowed.availableToSell.contains(this.symbol), - buyingAllowed = state.tradeCryptoAllowed.buyingAllowed - ) ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt index ba5d6c7d56..bff0032c0f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/WalletReducer.kt @@ -96,21 +96,18 @@ private fun internalReduce(action: Action, state: AppState): WalletState { ), mainButton = WalletMainButton.SendButton(false), tradeCryptoState = TradeCryptoState( - sellingAllowed = action.allowToSell ?: wallet.tradeCryptoState.sellingAllowed && - state.walletState.tradeCryptoAllowed.availableToSell.contains(wallet.currencyData.currencySymbol), - buyingAllowed = action.allowToBuy - ?: wallet.tradeCryptoState.buyingAllowed + sellingAllowed = action.moonpayStatus?.availableToSell?.contains( + wallet.currencyData.currencySymbol + ) ?: wallet.tradeCryptoState.sellingAllowed, + buyingAllowed = action.moonpayStatus?.availableToBuy?.contains( + wallet.currencyData.currencySymbol + ) ?: wallet.tradeCryptoState.buyingAllowed ) ) } - val tradeCryptoAllowed = TradeCryptoAvailability( - sellingAllowed = action.allowToSell ?: false, - buyingAllowed = action.allowToBuy ?: false - ) newState = newState.copy( state = ProgressState.Loading, wallets = wallets, - tradeCryptoAllowed = tradeCryptoAllowed ) } else { val walletManager = newState.getWalletManager(action.blockchain) ?: return newState @@ -127,10 +124,12 @@ private fun internalReduce(action: Action, state: AppState): WalletState { ), mainButton = WalletMainButton.SendButton(false), tradeCryptoState = TradeCryptoState( - sellingAllowed = action.allowToSell ?: wallet.tradeCryptoState.sellingAllowed && - state.walletState.tradeCryptoAllowed.availableToSell.contains(wallet.currencyData.currencySymbol), - buyingAllowed = action.allowToBuy - ?: wallet.tradeCryptoState.buyingAllowed + sellingAllowed = action.moonpayStatus?.availableToSell?.contains( + wallet.currencyData.currencySymbol + ) ?: wallet.tradeCryptoState.sellingAllowed, + buyingAllowed = action.moonpayStatus?.availableToBuy?.contains( + wallet.currencyData.currencySymbol + ) ?: wallet.tradeCryptoState.buyingAllowed ) ) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index 9a4051f137..28c3b09488 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -127,8 +127,6 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), StoreS srl_wallet_details.setOnRefreshListener { if (selectedWallet.currencyData.status != BalanceStatus.Loading) { store.dispatch(WalletAction.LoadWallet( - allowToBuy = selectedWallet.tradeCryptoState.buyingAllowed, - allowToSell = selectedWallet.tradeCryptoState.sellingAllowed, blockchain = selectedWallet.currency?.blockchain )) } diff --git a/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayApi.kt b/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayApi.kt index f3e062abf3..5d1bfbb5c2 100644 --- a/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayApi.kt +++ b/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayApi.kt @@ -4,13 +4,20 @@ import retrofit2.http.GET import retrofit2.http.Query interface MoonpayApi { - @GET( MOOONPAY_IP_ADDRESS_REQUEST_URL) + @GET(MOOONPAY_IP_ADDRESS_REQUEST_URL) suspend fun getUserStatus( - @Query("apiKey") moonpayApiKey: String + @Query("apiKey") moonpayApiKey: String, ): MoonPayUserStatus + @GET(MOOONPAY_CURRENCIES_REQUEST_URL) + suspend fun getCurrencies( + @Query("apiKey") moonpayApiKey: String, + ): List + + companion object { - const val MOOONPAY_BASE_URL = "https://api.moonpay.com/v4/" - const val MOOONPAY_IP_ADDRESS_REQUEST_URL = "ip_address/" + const val MOOONPAY_BASE_URL = "https://api.moonpay.com/" + const val MOOONPAY_IP_ADDRESS_REQUEST_URL = "v4/ip_address/" + const val MOOONPAY_CURRENCIES_REQUEST_URL = "v3/currencies/" } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayService.kt b/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayService.kt index 9ef4b8b678..5af8eb3395 100644 --- a/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayService.kt +++ b/app/src/main/java/com/tangem/tap/network/moonpay/MoonpayService.kt @@ -1,9 +1,12 @@ package com.tangem.tap.network.moonpay +import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import com.tangem.common.services.Result -import com.tangem.common.services.performRequest +import com.tangem.common.services.retryIO import com.tangem.tap.network.createRetrofitInstance +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope class MoonpayService { @@ -12,13 +15,75 @@ class MoonpayService { .create(MoonpayApi::class.java) } - suspend fun getUserStatus(moonpayApiKey: String): Result { - return performRequest { moonpayApi.getUserStatus(moonpayApiKey) } + suspend fun getMoonpayStatus(moonpayApiKey: String): Result { + return try { + coroutineScope { + + val userStatusDeferred = + retryIO { async { moonpayApi.getUserStatus(moonpayApiKey) } } + val currenciesDeferred = + retryIO { async { moonpayApi.getCurrencies(moonpayApiKey) } } + val userStatus = userStatusDeferred.await() + + val currenciesToBuy = mutableListOf() + val currenciesToSell = mutableListOf() + + currenciesDeferred.await().forEach { currencyStatus -> + if (currencyStatus.type != "crypto" || currencyStatus.isSuspended || + !currencyStatus.supportsLiveMode + ) { + return@forEach + } + + if (userStatus.countryCode == "USA") { + if (!currencyStatus.isSupportedInUS) return@forEach + if (currencyStatus.notAllowedUSStates.contains(userStatus.stateCode)) return@forEach + } + val currencyCode = currencyStatus.code.uppercase() + currenciesToBuy.add(currencyCode) + + if (currencyStatus.isSellSupported) currenciesToSell.add(currencyCode) + } + + Result.Success(MoonpayStatus( + isBuyAllowed = userStatus.isBuyAllowed, + isSellAllowed = userStatus.isSellAllowed, + availableToBuy = if (userStatus.isBuyAllowed) currenciesToBuy else emptyList(), + availableToSell = if (userStatus.isSellAllowed) currenciesToSell else emptyList() + )) + } + } catch (error: Error) { + Result.Failure(error) + } } } +data class MoonpayStatus( + val isBuyAllowed: Boolean, + val isSellAllowed: Boolean, + val availableToBuy: List, + val availableToSell: List, +) + @JsonClass(generateAdapter = true) data class MoonPayUserStatus( val isBuyAllowed: Boolean, - val isSellAllowed: Boolean + val isSellAllowed: Boolean, + @Json(name = "isAllowed") + val isMoonpayAllowed: Boolean, + @Json(name = "alpha3") + val countryCode: String, + @Json(name = "state") + val stateCode: String, +) + +@JsonClass(generateAdapter = true) +data class MoonpayCurrencies( + val type: String, + val code: String, + val supportsLiveMode: Boolean = false, + val isSuspended: Boolean = true, + val isSupportedInUS: Boolean = false, + val isSellSupported: Boolean = false, + val notAllowedUSStates: List = emptyList(), ) \ No newline at end of file From 0343e9885a749e166a73a9deacc8fd99cdca2390 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 3 Nov 2021 17:07:05 +0300 Subject: [PATCH 2/2] Updated on 2026-08-14 --- .../products/note/redux/OnboardingNoteState.kt | 10 +++++++++- .../onboarding/products/twins/redux/TwinCardsState.kt | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt index c111b83470..27310efe16 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteState.kt @@ -1,8 +1,10 @@ package com.tangem.tap.features.onboarding.products.note.redux +import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.WalletManager import com.tangem.tap.domain.TapError import com.tangem.tap.features.onboarding.OnboardingWalletBalance +import com.tangem.tap.network.moonpay.MoonpayStatus import com.tangem.tap.store import org.rekotlin.StateType import kotlin.properties.ReadOnlyProperty @@ -26,10 +28,16 @@ data class OnboardingNoteState( get() = steps.indexOf(currentStep) val isBuyAllowed: Boolean by ReadOnlyProperty { thisRef, property -> - store.state.globalState.moonpayStatus?.isBuyAllowed ?: false + store.state.globalState.moonpayStatus?.canBuy(walletBalance) ?: false } } +fun MoonpayStatus.canBuy(walletBalance: OnboardingWalletBalance): Boolean { + if (walletBalance.currency.blockchain == Blockchain.Unknown) return false + + return isBuyAllowed && availableToBuy.contains(walletBalance.currency.currencySymbol) +} + enum class OnboardingNoteStep { None, CreateWallet, TopUpWallet, Done } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt index 84ab30a9d8..6f7d27ec14 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt @@ -5,6 +5,7 @@ import com.tangem.tap.domain.TapError import com.tangem.tap.domain.twins.TwinCardNumber import com.tangem.tap.domain.twins.TwinCardsManager import com.tangem.tap.features.onboarding.OnboardingWalletBalance +import com.tangem.tap.features.onboarding.products.note.redux.canBuy import com.tangem.tap.store import org.rekotlin.StateType import kotlin.properties.ReadOnlyProperty @@ -56,7 +57,7 @@ data class TwinCardsState( get() = currentStep == TwinCardsStep.CreateSecondWallet || currentStep == TwinCardsStep.CreateThirdWallet val isBuyAllowed: Boolean by ReadOnlyProperty { thisRef, property -> - store.state.globalState.moonpayStatus?.isBuyAllowed ?: false + store.state.globalState.moonpayStatus?.canBuy(walletBalance) ?: false } }