From b5bd543445e8cab0131f0a83316d3754d07bdd5b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Jun 2021 16:06:25 +0300 Subject: [PATCH 1/6] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/domain/extensions/Card.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt index 00e6acb92f..9e805a29de 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt @@ -13,6 +13,7 @@ fun Card.getToken(): Token? { val symbol = cardData?.tokenSymbol ?: return null val contractAddress = cardData?.tokenContractAddress ?: return null val decimals = cardData?.tokenDecimal ?: return null + if (symbol.isBlank() || contractAddress.isBlank()) return null return Token(symbol, contractAddress, decimals) } From a215c43f0c2da5e775ed3e16f986062eb42d6a8e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Jun 2021 16:07:55 +0300 Subject: [PATCH 2/6] Updated on 2026-08-14 --- app/src/main/res/layout/layout_wallet_details.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/layout_wallet_details.xml b/app/src/main/res/layout/layout_wallet_details.xml index f8ac54763e..63bbb5f031 100644 --- a/app/src/main/res/layout/layout_wallet_details.xml +++ b/app/src/main/res/layout/layout_wallet_details.xml @@ -101,13 +101,13 @@ android:layout_marginTop="10dp" android:layout_marginEnd="14dp" android:ellipsize="middle" - android:maxLines="2" android:textColor="@color/darkGray1" android:textSize="13sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/iv_qr_code" app:layout_constraintTop_toTopOf="@id/iv_qr_code" - tools:text="139mrsJgyWnJjkljlkhiuojlkljkjljljlkjlkljlkjkljlkjlkjkljky9BV" /> + tools:text="139mrsJgyWnJjkljlkhiuojlkljkjljljlkjlkfsdkdsjflsdkjflsdkjfffffffljlkjkljlkjlkjkljky9BV" + android:singleLine="true" /> Date: Thu, 10 Jun 2021 16:11:08 +0300 Subject: [PATCH 3/6] Updated on 2026-08-14 --- .../com/tangem/tap/features/details/redux/DetailsReducer.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index d68c0ba268..3a7b39e788 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -12,6 +12,7 @@ import com.tangem.tap.domain.twins.TwinsHelper import com.tangem.tap.domain.twins.isTwinCard import com.tangem.tap.features.details.redux.twins.CreateTwinWalletReducer import com.tangem.tap.features.details.redux.twins.CreateTwinWalletState +import com.tangem.tap.features.wallet.models.toPendingTransactions import org.rekotlin.Action import java.util.* @@ -89,7 +90,8 @@ private fun handleEraseWallet(action: DetailsAction.EraseWallet, state: DetailsS || state.card?.settingsMask?.contains(Settings.IsReusable) == false || state.card?.isWalletDataSupported == true val notEmpty = state.wallets.any { - !it.recentTransactions.isNullOrEmpty() || it.amounts.toSendableAmounts().isNotEmpty() + !it.recentTransactions.toPendingTransactions(it.address).isNullOrEmpty() + || it.amounts.toSendableAmounts().isNotEmpty() } val eraseWalletState = when { notAllowedByCard -> EraseWalletState.NotAllowedByCard From 9e9883fb88aa3aa8768728ea8fdaf1fad81c7da9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Jun 2021 16:13:28 +0300 Subject: [PATCH 4/6] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_details.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml index 35ff627980..70c51c9eb3 100644 --- a/app/src/main/res/layout/fragment_details.xml +++ b/app/src/main/res/layout/fragment_details.xml @@ -120,7 +120,7 @@ android:layout_height="wrap_content" android:drawablePadding="15dp" android:paddingTop="7dp" - android:paddingBottom="10dp" + android:paddingBottom="7dp" android:text="@string/disclaimer_title" android:textColor="@color/darkGray6" android:textSize="16sp" @@ -179,8 +179,8 @@ android:id="@+id/tv_app_currency_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="10dp" - android:paddingBottom="10dp" + android:paddingTop="7dp" + android:paddingBottom="7dp" android:text="@string/details_row_title_currency" android:textColor="@color/darkGray6" android:textSize="16sp" @@ -191,8 +191,8 @@ android:id="@+id/tv_send_feedback" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="10dp" - android:paddingBottom="10dp" + android:paddingTop="7dp" + android:paddingBottom="7dp" android:text="@string/details_row_title_send_feedback" android:textColor="@color/darkGray6" android:textSize="16sp" @@ -204,8 +204,8 @@ android:id="@+id/tv_wallet_connect" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="10dp" - android:paddingBottom="10dp" + android:paddingTop="7dp" + android:paddingBottom="7dp" android:text="@string/wallet_connect" android:textColor="@color/darkGray6" android:textSize="16sp" @@ -257,7 +257,7 @@ android:id="@+id/tv_security_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="10dp" + android:paddingTop="7dp" android:paddingBottom="7dp" android:text="@string/details_row_title_manage_security" android:textColor="@color/darkGray6" From f46e75a6767a608e1205ef1b96e4e21379edb89f Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Jun 2021 16:42:21 +0300 Subject: [PATCH 5/6] Updated on 2026-08-14 --- .../middlewares/MultiWalletMiddleware.kt | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) 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 5487eec050..e2a0042f55 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 @@ -1,11 +1,9 @@ package com.tangem.tap.features.wallet.redux.middlewares -import com.tangem.blockchain.common.AmountType -import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchain.common.Token -import com.tangem.blockchain.common.TokenFinder +import com.tangem.blockchain.common.* import com.tangem.blockchain.extensions.Result import com.tangem.common.extensions.isZero +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction @@ -43,9 +41,11 @@ class MultiWalletMiddleware { addToken(action.token, walletState, globalState) } is WalletAction.MultiWallet.AddTokens -> { - action.tokens.map { addToken(it, walletState, globalState) } + addTokens(action.tokens, walletState, globalState) } is WalletAction.MultiWallet.AddBlockchain -> { + if (walletState?.blockchains?.contains(action.blockchain) == true) return + globalState?.scanNoteResponse?.card?.let { card -> currenciesRepository.saveAddedBlockchain(card.cardId, action.blockchain) globalState.tapWalletManager.walletManagerFactory @@ -163,13 +163,44 @@ class MultiWalletMiddleware { ) scope.launch { - val result = walletManager?.addToken(token) - withContext(Dispatchers.Main) { - when (result) { + when (val result = walletManager?.addToken(token)) { + is Result.Success -> { + store.dispatchOnMain( + WalletAction.MultiWallet.TokenLoaded(amount = result.data, token = token) + ) + } + } + } + } + + private fun addTokens( + tokens: List, + walletState: WalletState?, + globalState: GlobalState?, + ) { + val card = globalState?.scanNoteResponse?.card ?: return + val tokensWithManagers = tokens.map { token -> + val walletManager = walletState?.getWalletManager(token) + ?: globalState.tapWalletManager.walletManagerFactory.makeWalletManagerForApp( + card = card, + blockchain = Blockchain.Ethereum + )?.also { walletManager -> + store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManager)) + store.dispatch(WalletAction.MultiWallet.AddBlockchain(walletManager.wallet.blockchain)) + } + store.dispatch(WalletAction.LoadFiatRate(currency = Currency.Token( + token = token, + blockchain = walletManager?.wallet?.blockchain ?: Blockchain.Ethereum + ))) + TokenWithManager(token, walletManager) + } + scope.launch { + tokensWithManagers.forEach { + when (val result = it.walletManager?.addToken(it.token)) { is Result.Success -> { - store.dispatch( + store.dispatchOnMain( WalletAction.MultiWallet.TokenLoaded( - amount = result.data, token = token + amount = result.data, token = it.token ) ) } @@ -177,4 +208,6 @@ class MultiWalletMiddleware { } } } + + private data class TokenWithManager(val token: Token, val walletManager: WalletManager?) } \ No newline at end of file From db391edfe83d9833dc96c5446435c6507e556d4e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Jun 2021 16:54:33 +0300 Subject: [PATCH 6/6] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 20 +++-- .../tap/domain/tokens/CurrenciesRepository.kt | 75 +++++++++++-------- .../features/tokens/redux/TokensReducer.kt | 6 +- .../tap/features/wallet/redux/WalletState.kt | 12 ++- .../redux/reducers/MultiWalletReducer.kt | 71 ++++++++---------- dependencies.gradle | 2 +- 6 files changed, 100 insertions(+), 86 deletions(-) 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 360c6f1b07..357db63124 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -184,23 +184,32 @@ class TapWalletManager { private fun loadMultiWalletData( card: Card, primaryBlockchain: Blockchain?, primaryWalletManager: WalletManager? ) { - val presetTokens = primaryWalletManager?.presetTokens?.toList() ?: emptyList() + val presetTokens = primaryWalletManager?.presetTokens ?: emptySet() val savedCurrencies = currenciesRepository.loadCardCurrencies(card.cardId) if (savedCurrencies == null) { if (primaryBlockchain != null && primaryWalletManager != null) { store.dispatch(WalletAction.MultiWallet.SaveCurrencies( CardCurrencies( - blockchains = listOf(primaryBlockchain), tokens = presetTokens + blockchains = setOf(primaryBlockchain), tokens = presetTokens ))) store.dispatch(WalletAction.MultiWallet.AddWalletManagers(primaryWalletManager)) store.dispatch(WalletAction.MultiWallet.AddBlockchains(listOf(primaryBlockchain))) - store.dispatch(WalletAction.MultiWallet.AddTokens(presetTokens)) + store.dispatch(WalletAction.MultiWallet.AddTokens(presetTokens.toList())) + } else { + val blockchains = setOf(Blockchain.Bitcoin, Blockchain.Ethereum) + store.dispatch(WalletAction.MultiWallet.SaveCurrencies( + CardCurrencies(blockchains = blockchains, tokens = emptySet()) + )) + val walletManagers = + walletManagerFactory.makeWalletManagersForApp(card, blockchains.toList()) + store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManagers)) + store.dispatch(WalletAction.MultiWallet.AddBlockchains(blockchains.toList())) } store.dispatch(WalletAction.MultiWallet.FindBlockchainsInUse(card, walletManagerFactory)) store.dispatch(WalletAction.MultiWallet.FindTokensInUse) } else { - val blockchains = savedCurrencies.blockchains + val blockchains = savedCurrencies.blockchains.toList() val walletManagers = if ( presetTokens.isNotEmpty() && primaryWalletManager != null && primaryBlockchain != null @@ -214,8 +223,7 @@ class TapWalletManager { store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManagers)) store.dispatch(WalletAction.MultiWallet.AddBlockchains(blockchains)) - store.dispatch(WalletAction.MultiWallet.AddTokens(savedCurrencies.tokens)) - store.dispatch(WalletAction.MultiWallet.FindTokensInUse) + store.dispatch(WalletAction.MultiWallet.AddTokens(savedCurrencies.tokens.toList())) } } diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt index 78afe93215..417c3cb79e 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt @@ -13,11 +13,11 @@ import com.tangem.tap.network.createMoshi class CurrenciesRepository(val context: Application) { private val moshi = createMoshi() - private val tokensAdapter: JsonAdapter> = moshi.adapter( - Types.newParameterizedType(List::class.java, TokenDao::class.java) + private val tokensAdapter: JsonAdapter> = moshi.adapter( + Types.newParameterizedType(Set::class.java, TokenDao::class.java) ) - private val blockchainsAdapter: JsonAdapter> = moshi.adapter( - Types.newParameterizedType(List::class.java, Blockchain::class.java) + private val blockchainsAdapter: JsonAdapter> = moshi.adapter( + Types.newParameterizedType(Set::class.java, Blockchain::class.java) ) fun loadCardCurrencies(cardId: String): CardCurrencies? { @@ -43,45 +43,45 @@ class CurrenciesRepository(val context: Application) { } fun removeToken(cardId: String, token: Token) { - val tokens = loadSavedTokens(cardId).filterNot { it == token } + val tokens = loadSavedTokens(cardId).filterNot { it == token }.toSet() saveTokens(cardId, tokens) } fun removeBlockchain(cardId: String, blockchain: Blockchain) { - val blockchains = loadSavedBlockchains(cardId).filterNot { it == blockchain } + val blockchains = loadSavedBlockchains(cardId).filterNot { it == blockchain }.toSet() saveBlockchains(cardId, blockchains) } - private fun loadSavedTokens(cardId: String): List { + private fun loadSavedTokens(cardId: String): Set { return try { val json = context.readFileText(getFileNameForTokens(cardId)) - tokensAdapter.fromJson(json)!!.map { it.toToken() } + tokensAdapter.fromJson(json)!!.map { it.toToken() }.toSet() } catch (exception: Exception) { - emptyList() + emptySet() } } - private fun saveTokens(cardId: String, tokens: List) { - val json = tokensAdapter.toJson(tokens.map { TokenDao.fromToken(it) }) + private fun saveTokens(cardId: String, tokens: Set) { + val json = tokensAdapter.toJson(tokens.map { TokenDao.fromToken(it) }.toSet()) context.rewriteFile(json, getFileNameForTokens(cardId)) } - private fun loadSavedBlockchains(cardId: String): List { + private fun loadSavedBlockchains(cardId: String): Set { return try { val json = context.readFileText(getFileNameForBlockchains(cardId)) - blockchainsAdapter.fromJson(json) ?: emptyList() + blockchainsAdapter.fromJson(json) ?: emptySet() } catch (exception: Exception) { - emptyList() + emptySet() } } - private fun saveBlockchains(cardId: String, blockchains: List) { + private fun saveBlockchains(cardId: String, blockchains: Set) { val json = blockchainsAdapter.toJson(blockchains) context.rewriteFile(json, getFileNameForBlockchains(cardId)) } private fun Context.readFileText(fileName: String): String = - this.openFileInput(fileName).bufferedReader().readText() + this.openFileInput(fileName).bufferedReader().readText() private fun Context.rewriteFile(content: String, fileName: String) { this.openFileOutput(fileName, Context.MODE_PRIVATE).use { @@ -108,12 +108,13 @@ class CurrenciesRepository(val context: Application) { private const val FILE_NAME_PREFIX_BLOCKCHAINS = "blockchains" fun getFileNameForTokens(cardId: String): String = "${FILE_NAME_PREFIX_TOKENS}_$cardId" - fun getFileNameForBlockchains(cardId: String): String = "${FILE_NAME_PREFIX_BLOCKCHAINS}_$cardId" + fun getFileNameForBlockchains(cardId: String): String = + "${FILE_NAME_PREFIX_BLOCKCHAINS}_$cardId" private val secp256k1Blochcains = listOf( - Blockchain.Bitcoin, Blockchain.BitcoinCash, Blockchain.Binance, Blockchain.Litecoin, - Blockchain.XRP, Blockchain.Tezos, - Blockchain.Ethereum, Blockchain.RSK) + Blockchain.Bitcoin, Blockchain.BitcoinCash, Blockchain.Binance, Blockchain.Litecoin, + Blockchain.XRP, Blockchain.Tezos, + Blockchain.Ethereum, Blockchain.RSK) private val ed25519Blockchains = listOf(Blockchain.CardanoShelley, Blockchain.Stellar) } } @@ -121,18 +122,24 @@ class CurrenciesRepository(val context: Application) { @JsonClass(generateAdapter = true) data class TokenDao( - val name: String, - val symbol: String, - val contractAddress: String, - val decimalCount: Int + val name: String, + val symbol: String, + val contractAddress: String, + val decimalCount: Int, ) { fun toToken(): Token { - return Token(name = name, symbol = symbol, contractAddress = contractAddress, decimals = decimalCount) + return Token(name = name, + symbol = symbol, + contractAddress = contractAddress, + decimals = decimalCount) } companion object { fun fromToken(token: Token): TokenDao { - return TokenDao(name = token.name, symbol = token.symbol, contractAddress = token.contractAddress, decimalCount = token.decimals) + return TokenDao(name = token.name, + symbol = token.symbol, + contractAddress = token.contractAddress, + decimalCount = token.decimals) } } @@ -140,21 +147,25 @@ data class TokenDao( @JsonClass(generateAdapter = true) data class CardCurrenciesDao( - val tokens: List, - val blockchains: List + val tokens: Set, + val blockchains: Set, ) { fun toCardCurrencies(): CardCurrencies { - return CardCurrencies(tokens = tokens.map { it.toToken() }, blockchains = blockchains) + return CardCurrencies(tokens = tokens.map { it.toToken() }.toSet(), + blockchains = blockchains) } companion object { fun fromCardCurrencies(cardCurrencies: CardCurrencies): CardCurrenciesDao { - return CardCurrenciesDao(tokens = cardCurrencies.tokens.map { TokenDao.fromToken(it) }, blockchains = cardCurrencies.blockchains) + return CardCurrenciesDao( + tokens = cardCurrencies.tokens.map { TokenDao.fromToken(it) }.toSet(), + blockchains = cardCurrencies.blockchains + ) } } } data class CardCurrencies( - val tokens: List, - val blockchains: List + val tokens: Set, + val blockchains: Set, ) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt index be4a64b61e..66a7dd928b 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt @@ -21,8 +21,6 @@ private fun internalReduce(action: Action, state: AppState): TokensState { tokensState.copy(currencies = action.currencies) } is TokensAction.SetAddedCurrencies -> { - - tokensState.copy(addedCurrencies = action.wallets.toCardCurrencies()) } is TokensAction.LoadCardTokens.Success -> { @@ -35,7 +33,7 @@ private fun internalReduce(action: Action, state: AppState): TokensState { } private fun List.toCardCurrencies(): CardCurrencies { - val tokens = mapNotNull { (it.currency as? Currency.Token)?.token } - val blockchains = mapNotNull { (it.currency as? Currency.Blockchain)?.blockchain } + val tokens = mapNotNull { (it.currency as? Currency.Token)?.token }.toSet() + val blockchains = mapNotNull { (it.currency as? Currency.Blockchain)?.blockchain }.toSet() return CardCurrencies(tokens = tokens, blockchains = blockchains) } \ No newline at end of file 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 1b2a1aa4b0..35b301fd50 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 @@ -44,14 +44,17 @@ data class WalletState( val blockchains: List get() = walletManagers.map { it.wallet.blockchain } + val currencies: List + get() = wallets.mapNotNull { it.currency } + fun getWalletManager(token: Token?): WalletManager? { if (token == null) return null val ethereumWalletManager = walletManagers.find { it.wallet.blockchain == Blockchain.Ethereum } - return if (ethereumWalletManager?.presetTokens?.find { it == token } != null) { + return if (ethereumWalletManager?.presetTokens?.contains(token) == true) { ethereumWalletManager } else { val primaryWalletManager = walletManagers.find { it.wallet.blockchain == primaryBlockchain } - if (primaryWalletManager?.presetTokens?.find { it == token } != null) { + if (primaryWalletManager?.presetTokens?.contains(token) == true) { primaryWalletManager } else { ethereumWalletManager @@ -132,6 +135,11 @@ data class WalletState( return wallets.filter { !currencies.contains(it.currencyData.currency) } + newWallets } + fun addWalletManagers(newWalletManagers: List): WalletState { + val updatedWalletManagers = this.walletManagers + + newWalletManagers.filterNot { this.blockchains.contains(it.wallet.blockchain) } + return copy(walletManagers = updatedWalletManagers) + } } sealed class WalletDialog: StateDialog { 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 8c45a9b8c3..2f90f29e0f 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 @@ -2,6 +2,7 @@ package com.tangem.tap.features.wallet.redux.reducers import com.tangem.blockchain.common.AmountType import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.common.Token import com.tangem.common.extensions.isZero import com.tangem.tap.common.extensions.toFiatString import com.tangem.tap.common.extensions.toFormattedCurrencyString @@ -18,9 +19,7 @@ class MultiWalletReducer { fun reduce(action: WalletAction.MultiWallet, state: WalletState): WalletState { return when (action) { is WalletAction.MultiWallet.AddWalletManagers -> { - state.copy( - walletManagers = state.walletManagers + action.walletManagers - ) + state.addWalletManagers(action.walletManagers) } is WalletAction.MultiWallet.AddBlockchains -> { val wallets = action.blockchains.map { blockchain -> @@ -75,47 +74,12 @@ class MultiWalletReducer { } } is WalletAction.MultiWallet.AddTokens -> { - if (!state.isMultiwalletAllowed) return state - val wallets = action.tokens.map { token -> - val walletManager = state.getWalletManager(token)?.wallet - WalletData( - currencyData = BalanceWidgetData( - BalanceStatus.Loading, - currency = token.name, - currencySymbol = token.symbol - ), - walletAddresses = createAddressList(walletManager), - mainButton = WalletMainButton.SendButton(false), - topUpState = TopUpState(allowed = false), - currency = Currency.Token( - token = token, - blockchain = walletManager?.blockchain ?: Blockchain.Ethereum - ) - ) - } + val wallets = action.tokens.mapNotNull { token -> token.toWallet(state) } state.copy(wallets = state.replaceSomeWallets(wallets)) } is WalletAction.MultiWallet.AddToken -> { - if (!state.isMultiwalletAllowed) return state - val walletManager = state.getWalletManager(action.token)?.wallet - val walletAddresses = createAddressList(walletManager) - - val wallet = WalletData( - currencyData = BalanceWidgetData( - BalanceStatus.Loading, - currency = action.token.name, - currencySymbol = action.token.symbol - ), - walletAddresses = walletAddresses, - mainButton = WalletMainButton.SendButton(false), - topUpState = TopUpState(allowed = false), - currency = Currency.Token( - token = action.token, - blockchain = walletManager?.blockchain ?: Blockchain.Ethereum - ) - ) - val wallets = state.replaceWalletInWallets(wallet) - state.copy(wallets = wallets) + val walletData = action.token.toWallet(state) ?: return state + state.copy(wallets = state.replaceWalletInWallets(walletData)) } is WalletAction.MultiWallet.TokenLoaded -> { val pendingTransactions = state.getWalletManager(action.token) @@ -182,4 +146,29 @@ class MultiWalletReducer { is WalletAction.MultiWallet.SaveCurrencies -> state } } +} + +fun Token.toWallet(state: WalletState): WalletData? { + if (!state.isMultiwalletAllowed) return null + if (state.currencies.any { it is Currency.Token && it.token == this }) { + return null + } + + val walletManager = state.getWalletManager(this)?.wallet + val walletAddresses = createAddressList(walletManager) + + return WalletData( + currencyData = BalanceWidgetData( + BalanceStatus.Loading, + currency = this.name, + currencySymbol = this.symbol + ), + walletAddresses = walletAddresses, + mainButton = WalletMainButton.SendButton(false), + topUpState = TopUpState(allowed = false), + currency = Currency.Token( + token = this, + blockchain = walletManager?.blockchain ?: Blockchain.Ethereum + ) + ) } \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index b28e81e8b9..32b0ea5280 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,4 +1,4 @@ ext.versions = [ - kotlin : '1.5.0', + kotlin : '1.5.10', build_gradle: '4.2.1', ]