From 6d1117a3e0c10b5f09373d9d00e9b4644faa3651 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 27 Jan 2023 14:31:27 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/domain/model/WalletDataModel.kt | 2 + .../model/builders/WalletStoreBuilder.kt | 8 +- .../wallet/redux/middlewares/Mapper.kt | 121 ++++++++++++------ .../redux/middlewares/WalletMiddleware.kt | 2 +- 4 files changed, 94 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/model/WalletDataModel.kt b/app/src/main/java/com/tangem/tap/domain/model/WalletDataModel.kt index 4462f4d8ec..3429afa07c 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/WalletDataModel.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/WalletDataModel.kt @@ -14,6 +14,7 @@ import java.math.BigDecimal * @param existentialDeposit Amount that must be held on currency's balance, if balance is below that amount all * founds will be destroyed. Null if currency don't have existential deposit * @param fiatRate Wallet's fiat rate, used to calculate fiat balance. Null if not provided + * @param isCardSingleToken shows that [Currency] is a card token * */ data class WalletDataModel( val currency: Currency, @@ -21,6 +22,7 @@ data class WalletDataModel( val walletAddresses: List, val existentialDeposit: BigDecimal?, val fiatRate: BigDecimal?, + val isCardSingleToken: Boolean, ) { /** diff --git a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt index e76a291668..2bfbe6283d 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/builders/WalletStoreBuilder.kt @@ -73,13 +73,13 @@ private class WalletMangerWalletStoreBuilderImpl( override fun build(): WalletStoreModel { val wallet = walletManager.wallet val blockchainWalletData = wallet.blockchain.toBlockchainWalletData(walletManager) - val tokenWalletsData = wallet.getTokens().firstOrNull()?.toTokenWalletData(walletManager) + val tokenWalletsData = walletManager.cardTokens.map { it.toTokenWalletData(walletManager) } return WalletStoreModel( userWalletId = userWalletId, blockchain = wallet.blockchain, derivationPath = wallet.publicKey.derivationPath, - walletsData = (listOf(blockchainWalletData) + listOfNotNull(tokenWalletsData)), + walletsData = (listOf(blockchainWalletData) + tokenWalletsData), walletRent = null, walletManager = walletManager, blockchainNetwork = BlockchainNetwork.fromWalletManager(walletManager), @@ -97,6 +97,7 @@ private fun BlockchainNetwork.getBlockchainWalletData(walletManager: WalletManag walletAddresses = walletManager?.wallet?.createAddressesData().orEmpty(), existentialDeposit = getExistentialDeposit(walletManager), fiatRate = null, + isCardSingleToken = false ) } @@ -113,6 +114,7 @@ private fun BlockchainNetwork.getTokensWalletsData(walletManager: WalletManager? walletAddresses = walletManager?.wallet?.createAddressesData().orEmpty(), existentialDeposit = getExistentialDeposit(walletManager), fiatRate = null, + isCardSingleToken = walletManager?.cardTokens?.contains(token) ?: false ) } } @@ -128,6 +130,7 @@ private fun Blockchain.toBlockchainWalletData(walletManager: WalletManager): Wal walletAddresses = wallet.createAddressesData(), existentialDeposit = getExistentialDeposit(walletManager), fiatRate = null, + isCardSingleToken = false, ) } @@ -143,6 +146,7 @@ private fun Token.toTokenWalletData(walletManager: WalletManager): WalletDataMod walletAddresses = wallet.createAddressesData(), existentialDeposit = getExistentialDeposit(walletManager), fiatRate = null, + isCardSingleToken = walletManager.cardTokens.contains(this) ) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt index 75b79e6a61..8209e5f65a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/Mapper.kt @@ -1,6 +1,6 @@ package com.tangem.tap.features.wallet.redux.middlewares -import com.tangem.blockchain.common.AmountType +import com.tangem.blockchain.common.Blockchain import com.tangem.common.extensions.isZero import com.tangem.tap.common.extensions.stripZeroPlainString import com.tangem.tap.common.extensions.toFiatRateString @@ -10,7 +10,6 @@ import com.tangem.tap.common.extensions.toFormattedFiatValue import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel -import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.models.TotalBalance import com.tangem.tap.features.wallet.models.WalletRent import com.tangem.tap.features.wallet.redux.ProgressState @@ -22,13 +21,12 @@ import com.tangem.tap.features.wallet.ui.BalanceStatus import com.tangem.tap.features.wallet.ui.BalanceWidgetData import com.tangem.tap.features.wallet.ui.TokenData import com.tangem.tap.store +import timber.log.Timber import java.math.BigDecimal -internal fun List.mapToReduxModels( - isMultiWalletAllowed: Boolean, -): List { +internal fun List.mapToReduxModels(): List { return this.map { walletStoreModel -> - walletStoreModel.mapToReduxModel(isMultiWalletAllowed) + walletStoreModel.mapToReduxModel() } } @@ -44,19 +42,20 @@ internal fun TotalFiatBalance.mapToReduxModel(): TotalBalance { ) } -internal fun WalletStoreModel.mapToReduxModel( - isMultiWalletAllowed: Boolean, -): WalletStore { +internal fun WalletStoreModel.mapToReduxModel(): WalletStore { + val appCurrencySymbol = store.state.globalState.appCurrency.symbol return WalletStore( walletManager = walletManager, blockchainNetwork = blockchainNetwork, - walletsData = walletsData.mapToReduxModel(isMultiWalletAllowed, walletRent), + walletsData = walletsData.mapToReduxModel(walletRent, appCurrencySymbol), ) + .updateTokenModels(blockchain) + .setupIfHadCardSingleToken(blockchain, walletsData, appCurrencySymbol) } private fun List.mapToReduxModel( - isMultiWalletAllowed: Boolean, walletRent: WalletStoreModel.WalletRent?, + appCurrencySymbol: String, ): List { return this.map { walletDataModel -> with(walletDataModel) { @@ -65,13 +64,11 @@ private fun List.mapToReduxModel( decimals = currency.decimals, currency = currency.currencySymbol, ) - val appCurrency = store.state.globalState.appCurrency val fiatAmount = fiatRate?.let { status.amount.toFiatValue(it) } val fiatAmountFormatted = fiatAmount ?.takeIf { !status.isErrorStatus } - ?.toFormattedFiatValue(appCurrency.symbol) - val fiatRateFormatted = fiatRate?.toFiatRateString(appCurrency.symbol) - val blockchainAmountValue = getBlockchainAmount() + ?.toFormattedFiatValue(appCurrencySymbol) + val fiatRateFormatted = fiatRate?.toFiatRateString(appCurrencySymbol) WalletData( currency = currency, @@ -86,9 +83,7 @@ private fun List.mapToReduxModel( fiatRateString = fiatRateFormatted, pendingTransactions = status.pendingTransactions, mainButton = WalletMainButton.SendButton( - enabled = !blockchainAmountValue.isZero() - && !status.amount.isZero() - && status.pendingTransactions.isEmpty(), + enabled = !status.amount.isZero() && status.pendingTransactions.isEmpty(), ), walletRent = walletRent?.let { WalletRent( @@ -108,25 +103,12 @@ private fun List.mapToReduxModel( }, currency = currency.currencyName, currencySymbol = currency.currencySymbol, - blockchainAmount = blockchainAmountValue, + blockchainAmount = BigDecimal.ZERO, amount = amount, amountFormatted = amountFormatted, fiatAmount = fiatAmount, fiatAmountFormatted = fiatAmountFormatted, - token = when { - !isMultiWalletAllowed && currency is Currency.Token -> { - TokenData( - amount = amount, - amountFormatted = amountFormatted, - fiatAmount = fiatAmount, - fiatAmountFormatted = fiatAmountFormatted, - tokenSymbol = currency.currencySymbol, - fiatRate = fiatRate, - fiatRateString = fiatRateFormatted, - ) - } - else -> null - }, + token = null, amountToCreateAccount = (status as? WalletDataModel.NoAccount) ?.amountToCreateAccount ?.toString(), @@ -137,7 +119,74 @@ private fun List.mapToReduxModel( } } -private fun WalletDataModel.getBlockchainAmount(): BigDecimal { - val walletStore = store.state.walletState.getWalletStore(currency) ?: return BigDecimal.ZERO - return walletStore.walletManager?.wallet?.amounts?.get(AmountType.Coin)?.value ?: BigDecimal.ZERO +private fun WalletStore.updateTokenModels(blockchain: Blockchain): WalletStore { + val foundBlockchains = this.walletsData.filter { + it.currency.isBlockchain() && it.currency.blockchain == blockchain + } + if (foundBlockchains.size != 1) { + val warningMessage = "Can't update information about Tokens in the WalletData list, because " + + "of the WalletStore doesn't contains the Blockchain: %s, or contains more than one" + Timber.w(warningMessage, blockchain.id) + return this + } + + val blockchainAmountValue = foundBlockchains.first().currencyData.blockchainAmount ?: BigDecimal.ZERO + val updatedTokensWalletData = walletsData.filter { it.currency.isToken() }.map { + it.copy( + mainButton = when (it.mainButton) { + is WalletMainButton.SendButton -> { + WalletMainButton.SendButton(it.mainButton.enabled && !blockchainAmountValue.isZero()) + } + is WalletMainButton.CreateWalletButton -> it.mainButton + }, + currencyData = it.currencyData.copy( + blockchainAmount = blockchainAmountValue, + ), + ) + } + return updateWallets(updatedTokensWalletData) +} + +private fun WalletStore.setupIfHadCardSingleToken( + blockchain: Blockchain, + walletsDataModel: List, + appCurrencySymbol: String, +): WalletStore { + // Card with single token contains only 2 model - blockchain and token + if (walletsData.size != 2) return this + + val blockchainWalletData = walletsData.firstOrNull { + it.currency.isBlockchain() && it.currency.blockchain == blockchain + } + val cardSingleTokenWalletData = walletsDataModel.firstOrNull { + it.currency.isToken() && it.currency.blockchain == blockchain && it.isCardSingleToken + } + if (blockchainWalletData == null || cardSingleTokenWalletData == null) return this + + val blockchainWalletDataWithSingleToken = blockchainWalletData.copy( + currencyData = blockchainWalletData.currencyData.copy( + token = cardSingleTokenWalletData.toTokenData(appCurrencySymbol), + ), + ) + return updateWallets(listOf(blockchainWalletDataWithSingleToken)) +} + +private fun WalletDataModel.toTokenData(appCurrencySymbol: String): TokenData { + val amount = status.amount + val fiatAmount = fiatRate?.let { status.amount.toFiatValue(it) } + + return TokenData( + amount = amount, + amountFormatted = amount.toFormattedCurrencyString( + decimals = currency.decimals, + currency = currency.currencySymbol, + ), + fiatAmount = fiatAmount, + fiatAmountFormatted = fiatAmount + ?.takeIf { !status.isErrorStatus } + ?.toFormattedFiatValue(appCurrencySymbol), + tokenSymbol = currency.currencySymbol, + fiatRate = fiatRate, + fiatRateString = fiatRate?.toFiatRateString(appCurrencySymbol), + ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 80b1ddfc2b..03b26092b2 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -318,7 +318,7 @@ class WalletMiddleware { } } - val reduxWalletStores = wallStores.mapToReduxModels(state.isMultiwalletAllowed) + val reduxWalletStores = wallStores.mapToReduxModels() store.dispatchOnMain( WalletAction.WalletStoresChanged.UpdateWalletStores( reduxWalletStores = reduxWalletStores,