From 6b95243f9a660a237f0a68a4d1401f732ee5d0d5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 8 Mar 2023 19:16:58 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/proxy/DerivationManagerImpl.kt | 13 ++++++++++--- .../com/tangem/tap/proxy/UserWalletManagerImpl.kt | 11 ++++++++--- .../referral/domain/ReferralInteractorImpl.kt | 15 +++++++++------ .../com/tangem/lib/crypto/DerivationManager.kt | 11 +++++++++-- 4 files changed, 36 insertions(+), 14 deletions(-) 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 ae2cdcfd1a..4fc1c8bfb4 100644 --- a/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/DerivationManagerImpl.kt @@ -59,12 +59,19 @@ class DerivationManagerImpl( } } - override fun hasDerivation(networkId: String): Boolean { + override fun getDerivationPathForBlockchain(networkId: String): String? { + val scanResponse = appStateHolder.scanResponse + val blockchain = Blockchain.fromNetworkId(networkId) + if (scanResponse != null && blockchain != null) { + return blockchain.derivationPath(appStateHolder.getActualCard()?.derivationStyle)?.rawPath + } + return null + } + + override fun hasDerivation(networkId: String, derivationPath: String): Boolean { val scanResponse = appStateHolder.scanResponse val blockchain = Blockchain.fromNetworkId(networkId) if (scanResponse != null && blockchain != null) { - val derivationPath = blockchain.derivationPath(appStateHolder.getActualCard()?.derivationStyle)?.rawPath - if (derivationPath.isNullOrEmpty()) return false return scanResponse.hasDerivation( blockchain, derivationPath, diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index 72836cacca..a6b1dc5348 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -93,9 +93,13 @@ class UserWalletManagerImpl( override suspend fun isTokenAdded(currency: Currency, derivationPath: String?): Boolean { val blockchain = requireNotNull(Blockchain.fromNetworkId(currency.networkId)) { "blockchain not found" } - val walletManager = getActualWalletManager(blockchain, derivationPath) - return walletManager.cardTokens.any { - it.id == currency.id + return try { + val walletManager = getActualWalletManager(blockchain, derivationPath) + walletManager.cardTokens.any { + it.id == currency.id + } + } catch (e: IllegalArgumentException) { + false } } @@ -191,6 +195,7 @@ class UserWalletManagerImpl( appStateHolder.mainStore?.dispatchOnMain(WalletAction.LoadData.Refresh) } + @kotlin.jvm.Throws(IllegalArgumentException::class) private fun getActualWalletManager(blockchain: Blockchain, derivationPath: String?): WalletManager { val blockchainNetwork = BlockchainNetwork(blockchain, derivationPath, emptyList()) return requireNotNull(appStateHolder.walletState?.getWalletManager(blockchainNetwork)) { diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt index 22e20981e5..3ed378f876 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt @@ -25,8 +25,8 @@ internal class ReferralInteractorImpl( override suspend fun startReferral(): ReferralData { if (tokensForReferral.isNotEmpty()) { val currency = tokensConverter.convert(tokensForReferral.first()) - deriveOrAddTokens(currency) - val publicAddress = userWalletManager.getWalletAddress(currency.networkId, null) + val derivationPath = deriveOrAddTokens(currency) + val publicAddress = userWalletManager.getWalletAddress(currency.networkId, derivationPath) return repository.startReferral( walletId = userWalletManager.getWalletId(), networkId = currency.networkId, @@ -38,13 +38,16 @@ internal class ReferralInteractorImpl( } } - private suspend fun deriveOrAddTokens(currency: Currency) { - if (!derivationManager.hasDerivation(currency.networkId)) { + private suspend fun deriveOrAddTokens(currency: Currency): String { + val derivationPath = derivationManager.getDerivationPathForBlockchain(currency.networkId) + if (derivationPath.isNullOrEmpty()) error("derivationPath shouldn't be empty") + if (!derivationManager.hasDerivation(currency.networkId, derivationPath)) { derivationManager.deriveMissingBlockchains(currency) } - if (!userWalletManager.isTokenAdded(currency, null)) { - userWalletManager.addToken(currency, null) + if (!userWalletManager.isTokenAdded(currency, derivationPath)) { + userWalletManager.addToken(currency, derivationPath) } + return derivationPath } private fun saveRefTokens(tokens: List) { diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt index b9b2cfecea..7dd3d51970 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/DerivationManager.kt @@ -12,7 +12,14 @@ interface DerivationManager { suspend fun deriveMissingBlockchains(currency: Currency): Boolean /** - * Checks that given [networkId] has derivations + * Returns derivationPath or null for blockchain with given networkId + * + * @param networkId */ - fun hasDerivation(networkId: String): Boolean + fun getDerivationPathForBlockchain(networkId: String): String? + + /** + * Checks that given [networkId] has derivations for [derivationPath] + */ + fun hasDerivation(networkId: String, derivationPath: String): Boolean } \ No newline at end of file