diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt index 7071f8c24d..f104a8ca09 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/DefaultCustomTokenInteractor.kt @@ -4,6 +4,7 @@ import com.tangem.blockchain.blockchains.cardano.CardanoUtils import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.common.card.EllipticCurve +import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap @@ -76,7 +77,17 @@ class DefaultCustomTokenInteractor( curve?.let { getDerivations(curve, scanResponse, currency) } } - val derivations = derivationDataList.associate(TokensMiddleware.DerivationData::derivations) + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } if (derivations.isEmpty()) { onSuccess(scanResponse) return @@ -115,10 +126,7 @@ class DefaultCustomTokenInteractor( val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt index a70d6379c1..64bd577f52 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/domain/DefaultTokensListInteractor.kt @@ -6,6 +6,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.derivation.DerivationStyle import com.tangem.common.CompletionResult import com.tangem.common.card.EllipticCurve +import com.tangem.common.extensions.ByteArrayKey import com.tangem.common.extensions.guard import com.tangem.common.extensions.toMapKey import com.tangem.common.flatMap @@ -136,11 +137,22 @@ internal class DefaultTokensListInteractor( private suspend fun deriveMissingBlockchains(scanResponse: ScanResponse, currencies: List) { val config = CardConfig.createConfig(scanResponse.card) - val derivations = currencies.mapNotNull { currency -> + val derivationDataList = currencies.mapNotNull { currency -> val curve = config.primaryCurve(currency.blockchain) curve?.let { getDerivations(curve, scanResponse, currency) } - }.associate(transform = TokensMiddleware.DerivationData::derivations) + } + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } if (derivations.isEmpty()) { submitAdd(scanResponse, currencies) return @@ -181,10 +193,7 @@ internal class DefaultTokensListInteractor( val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt index 70ac55b12f..2785c63857 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/legacy/redux/TokensMiddleware.kt @@ -125,7 +125,18 @@ object TokensMiddleware { val curve = config.primaryCurve(currency.blockchain) curve?.let { getDerivations(curve, scanResponse, currency) } } - val derivations = derivationDataList.associate { it.derivations } + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } + if (derivations.isEmpty()) { onSuccess(scanResponse) return @@ -167,10 +178,7 @@ object TokensMiddleware { val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let { diff --git a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt index 34a6d471b2..d03a7956e9 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -102,7 +102,17 @@ class DerivationManagerImpl( val curve = config.primaryCurve(currency.blockchain) curve?.let { getDerivations(curve, scanResponse, currency) } } - val derivations = derivationDataList.associate { it.derivations } + val derivations = buildMap> { + derivationDataList.forEach { + val current = this[it.derivations.first] + if (current != null) { + current.addAll(it.derivations.second) + current.distinct() + } else { + this[it.derivations.first] = it.derivations.second.toMutableList() + } + } + } if (derivations.isEmpty()) { onSuccess(scanResponse) return @@ -165,10 +175,7 @@ class DerivationManagerImpl( val wallet = scanResponse.card.wallets.firstOrNull { it.curve == curve } ?: return null val supportedCurves = currency.blockchain.getSupportedCurves() - val path = currency.derivationPath - ?.let { - currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) - } + val path = currency.blockchain.derivationPath(scanResponse.derivationStyleProvider.getDerivationStyle()) .takeIf { supportedCurves.contains(curve) } val customPath = currency.derivationPath?.let {