From 25d39f9f0b20a5c38f5d8a7d8ef591e6f4c578ce Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 6 Mar 2023 18:19:26 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/common/IntentHandler.kt | 1 - .../middlewares/TradeCryptoMiddleware.kt | 6 ++- .../tap/proxy/TransactionManagerImpl.kt | 30 +++++------ .../tangem/tap/proxy/UserWalletManagerImpl.kt | 52 +++++++------------ .../referral/domain/ReferralInteractorImpl.kt | 6 +-- .../feature/swap/domain/SwapInteractor.kt | 2 + .../feature/swap/domain/SwapInteractorImpl.kt | 26 +++++++--- .../feature/swap/presentation/SwapFragment.kt | 1 + .../feature/swap/viewmodels/SwapViewModel.kt | 2 + .../tangem/lib/crypto/TransactionManager.kt | 7 ++- .../tangem/lib/crypto/UserWalletManager.kt | 19 ++++--- 11 files changed, 81 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/IntentHandler.kt b/app/src/main/java/com/tangem/tap/common/IntentHandler.kt index 12451bdd67..4d50c59679 100644 --- a/app/src/main/java/com/tangem/tap/common/IntentHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/IntentHandler.kt @@ -84,7 +84,6 @@ class IntentHandler { val successUri = Uri.parse(ExchangeUrlBuilder.SUCCESS_URL) if (data.host == successUri.host && data.authority == successUri.authority) { val currency = store.state.walletState.selectedCurrency ?: return - val currencyType = AnalyticsParam.CurrencyType.Currency(currency) Analytics.send(Token.Bought(currencyType)) } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 96967b136a..ec7597b8c7 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -161,7 +161,11 @@ class TradeCryptoMiddleware { private fun openSwap() { val currency = store.state.walletState.selectedWalletData?.currency?.toSwapCurrency() - val bundle = bundleOf(SwapFragment.CURRENCY_BUNDLE_KEY to Json.encodeToString(currency)) + val bundle = + bundleOf( + SwapFragment.CURRENCY_BUNDLE_KEY to Json.encodeToString(currency), + SwapFragment.DERIVATION_PATH to store.state.walletState.selectedWalletData?.currency?.derivationPath + ) store.dispatchOnMain(NavigationAction.NavigateTo(screen = AppScreen.Swap, bundle = bundle)) } diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index bc8fe9a242..7ac0ea6a9f 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -48,9 +48,10 @@ class TransactionManagerImpl( gasLimit: Int, destinationAddress: String, dataToSign: String, + derivationPath: String?, ): SendTxResult { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val walletManager = getActualWalletManager(blockchain) + val walletManager = getActualWalletManager(blockchain, derivationPath) walletManager.update() val amount = Amount(value = BigDecimal.ZERO, blockchain = blockchain) return sendTransactionInternal( @@ -73,9 +74,10 @@ class TransactionManagerImpl( dataToSign: String, isSwap: Boolean, currencyToSend: Currency, + derivationPath: String?, ): SendTxResult { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val walletManager = getActualWalletManager(blockchain) + val walletManager = getActualWalletManager(blockchain, derivationPath) walletManager.update() val amount = if (isSwap) { createAmountForSwap(amountToSend, currencyToSend, blockchain) @@ -129,9 +131,9 @@ class TransactionManagerImpl( return Blockchain.fromNetworkId(networkId)?.decimals() ?: error("blockchain not found") } - override suspend fun updateWalletManager(networkId: String) { + override suspend fun updateWalletManager(networkId: String, derivationPath: String?) { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - getActualWalletManager(blockchain).update() + getActualWalletManager(blockchain, derivationPath).update() } override fun calculateFee(networkId: String, gasPrice: String, estimatedGas: Int): BigDecimal { @@ -147,9 +149,10 @@ class TransactionManagerImpl( currencyToSend: Currency, destinationAddress: String, data: String?, + derivationPath: String?, ): ProxyFee { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val walletManager = getActualWalletManager(blockchain) + val walletManager = getActualWalletManager(blockchain, derivationPath) if (walletManager is EthereumWalletManager) { val gasLimit = getGasLimit( evmWalletManager = walletManager, @@ -293,19 +296,10 @@ class TransactionManagerImpl( } } - private fun getActualWalletManager(blockchain: Blockchain): WalletManager { - val card = appStateHolder.getActualCard() - if (card != null) { - val blockchainNetwork = BlockchainNetwork(blockchain, card) - val walletManager = appStateHolder.walletState?.getWalletManager(blockchainNetwork) - if (walletManager != null) { - return walletManager - } else { - error("no wallet manager found") - } - } else { - error("card not found") - } + private fun getActualWalletManager(blockchain: Blockchain, derivationPath: String?): WalletManager { + val blockchainNetwork = BlockchainNetwork(blockchain, derivationPath, emptyList()) + val walletManager = appStateHolder.walletState?.getWalletManager(blockchainNetwork) + return requireNotNull(walletManager) { "no wallet manager found" } } private fun createExtras( 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 c0c0c1ac91..a983ea5687 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -85,23 +85,17 @@ class UserWalletManagerImpl( ?: "" } - override suspend fun isTokenAdded(currency: Currency): Boolean { - val card = requireNotNull(appStateHolder.getActualCard()) { "card is null" } + override suspend fun isTokenAdded(currency: Currency, derivationPath: String?): Boolean { val blockchain = requireNotNull(Blockchain.fromNetworkId(currency.networkId)) { "blockchain not found" } - val blockchainNetwork = BlockchainNetwork(blockchain, card) - val walletManager = appStateHolder.walletState?.getWalletManager(blockchainNetwork) - if (walletManager != null) { - return walletManager.cardTokens.any { - it.id == currency.id - } + val walletManager = getActualWalletManager(blockchain, derivationPath) + return walletManager.cardTokens.any { + it.id == currency.id } - return false } - override suspend fun addToken(currency: Currency) { - val card = requireNotNull(appStateHolder.getActualCard()) { "card not found" } + override suspend fun addToken(currency: Currency, derivationPath: String?) { val blockchain = requireNotNull(Blockchain.fromNetworkId(currency.networkId)) { "blockchain not found" } - val blockchainNetwork = BlockchainNetwork(blockchain, card) + val blockchainNetwork = BlockchainNetwork(blockchain, derivationPath, emptyList()) val selectedUserWallet = userWalletsListManager.selectedUserWalletSync.guard { Timber.e("Unable to add token, no user wallet selected") @@ -113,34 +107,27 @@ class UserWalletManagerImpl( ) } - override fun getWalletAddress(networkId: String): String { + override fun getWalletAddress(networkId: String, derivationPath: String?): String { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val card = requireNotNull(appStateHolder.getActualCard()) { "card not found" } - val blockchainNetwork = BlockchainNetwork(blockchain, card) - val walletManager = appStateHolder.walletState?.getWalletManager(blockchainNetwork) - if (walletManager != null) { - return walletManager.wallet.address - } else { - error("no wallet manager found") - } + val walletManager = getActualWalletManager(blockchain, derivationPath) + return walletManager.wallet.address } - override fun getLastTransactionHash(networkId: String): String? { + override fun getLastTransactionHash(networkId: String, derivationPath: String?): String? { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val card = requireNotNull(appStateHolder.getActualCard()) { "card not found" } - val blockchainNetwork = BlockchainNetwork(blockchain, card) - val walletManager = appStateHolder.walletState?.getWalletManager(blockchainNetwork) - return walletManager?.wallet?.recentTransactions - ?.lastOrNull { it.hash?.isNotEmpty() == true } + val walletManager = getActualWalletManager(blockchain, derivationPath) + return walletManager.wallet.recentTransactions + .lastOrNull { it.hash?.isNotEmpty() == true } ?.hash?.let { HEX_PREFIX + it } } override suspend fun getCurrentWalletTokensBalance( networkId: String, extraTokens: List, + derivationPath: String?, ): Map { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val walletManager = getActualWalletManager(blockchain) + val walletManager = getActualWalletManager(blockchain, derivationPath) // workaround for get balance for tokens that doesn't exist in wallet val extraTokensToLoadBalance = extraTokens @@ -165,9 +152,9 @@ class UserWalletManagerImpl( return balances } - override fun getNativeTokenBalance(networkId: String): ProxyAmount? { + override fun getNativeTokenBalance(networkId: String, derivationPath: String?): ProxyAmount? { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - val walletManager = getActualWalletManager(blockchain) + val walletManager = getActualWalletManager(blockchain, derivationPath) return walletManager.wallet.amounts.firstNotNullOfOrNull { it.takeIf { it.key is AmountType.Coin } }?.value?.let { @@ -198,9 +185,8 @@ class UserWalletManagerImpl( appStateHolder.mainStore?.dispatchOnMain(WalletAction.LoadData.Refresh) } - private fun getActualWalletManager(blockchain: Blockchain): WalletManager { - val card = requireNotNull(appStateHolder.getActualCard()) { "card not found" } - val blockchainNetwork = BlockchainNetwork(blockchain, card) + private fun getActualWalletManager(blockchain: Blockchain, derivationPath: String?): WalletManager { + val blockchainNetwork = BlockchainNetwork(blockchain, derivationPath, emptyList()) return requireNotNull(appStateHolder.walletState?.getWalletManager(blockchainNetwork)) { "No wallet manager found" } 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 c7943b3cb6..22e20981e5 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 @@ -26,7 +26,7 @@ internal class ReferralInteractorImpl( if (tokensForReferral.isNotEmpty()) { val currency = tokensConverter.convert(tokensForReferral.first()) deriveOrAddTokens(currency) - val publicAddress = userWalletManager.getWalletAddress(currency.networkId) + val publicAddress = userWalletManager.getWalletAddress(currency.networkId, null) return repository.startReferral( walletId = userWalletManager.getWalletId(), networkId = currency.networkId, @@ -42,8 +42,8 @@ internal class ReferralInteractorImpl( if (!derivationManager.hasDerivation(currency.networkId)) { derivationManager.deriveMissingBlockchains(currency) } - if (!userWalletManager.isTokenAdded(currency)) { - userWalletManager.addToken(currency) + if (!userWalletManager.isTokenAdded(currency, null)) { + userWalletManager.addToken(currency, null) } } diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt index 1ea5c8378c..461f048ca8 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt @@ -11,6 +11,8 @@ import com.tangem.feature.swap.domain.models.ui.TxState interface SwapInteractor { + fun initDerivationPath(derivationPath: String?) + /** * Init tokens to swap, load tokens list available to swap for given network * diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 4127ecc179..98350f3244 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -39,6 +39,11 @@ internal class SwapInteractorImpl @Inject constructor( private val cryptoCurrencyConverter = CryptoCurrencyConverter() private val amountFormatter = AmountFormatter() + private var derivationPath: String? = null + + override fun initDerivationPath(derivationPath: String?) { + this.derivationPath = derivationPath + } override suspend fun initTokensToSwap(initialCurrency: Currency): TokensDataState { val networkId = initialCurrency.networkId @@ -63,7 +68,7 @@ internal class SwapInteractorImpl @Inject constructor( .filter { !loadedOnWalletsMap.contains(it.symbol) } - val tokensBalance = userWalletManager.getCurrentWalletTokensBalance(networkId, emptyList()) + val tokensBalance = userWalletManager.getCurrentWalletTokensBalance(networkId, emptyList(), derivationPath) .mapValues { SwapAmount(it.value.value, it.value.decimals) } val appCurrency = userWalletManager.getUserAppCurrency() val rates = repository.getRates(appCurrency.code, tokensInWallet.map { it.id }) @@ -118,11 +123,12 @@ internal class SwapInteractorImpl @Inject constructor( gasLimit = approveData.gasLimit, destinationAddress = approveData.approveModel.toAddress, dataToSign = approveData.approveModel.data, + derivationPath = derivationPath, ) return when (result) { is SendTxResult.Success -> { allowPermissionsHandler.addAddressToInProgress(forTokenContractAddress) - TxState.TxSent(txAddress = userWalletManager.getLastTransactionHash(networkId) ?: "") + TxState.TxSent(txAddress = userWalletManager.getLastTransactionHash(networkId, derivationPath) ?: "") } SendTxResult.UserCancelledError -> TxState.UserCancelled is SendTxResult.BlockchainSdkError -> TxState.BlockchainError @@ -149,7 +155,7 @@ internal class SwapInteractorImpl @Inject constructor( val isAllowedToSpend = checkAllowance(networkId, fromTokenAddress) if (isAllowedToSpend && allowPermissionsHandler.isAddressAllowanceInProgress(fromTokenAddress)) { allowPermissionsHandler.removeAddressFromProgress(fromTokenAddress) - transactionManager.updateWalletManager(networkId) + transactionManager.updateWalletManager(networkId, derivationPath) } val isBalanceWithoutFeeEnough = isBalanceEnough(fromToken, amount, null) return if (isAllowedToSpend && isBalanceWithoutFeeEnough) { @@ -192,10 +198,11 @@ internal class SwapInteractorImpl @Inject constructor( destinationAddress = swapStateData.swapModel.transaction.toWalletAddress, dataToSign = swapStateData.swapModel.transaction.data, isSwap = true, + derivationPath = derivationPath, ) return when (result) { is SendTxResult.Success -> { - userWalletManager.addToken(cryptoCurrencyConverter.convert(currencyToGet)) + userWalletManager.addToken(cryptoCurrencyConverter.convert(currencyToGet), derivationPath) userWalletManager.refreshWallet() TxState.TxSent( fromAmount = amountFormatter.formatSwapAmountToUI( @@ -206,7 +213,7 @@ internal class SwapInteractorImpl @Inject constructor( swapStateData.swapModel.toTokenAmount, currencyToGet.symbol, ), - txAddress = userWalletManager.getLastTransactionHash(networkId) ?: "", + txAddress = userWalletManager.getLastTransactionHash(networkId, derivationPath) ?: "", ) } SendTxResult.UserCancelledError -> TxState.UserCancelled @@ -285,7 +292,7 @@ internal class SwapInteractorImpl @Inject constructor( val allowance = repository.checkTokensSpendAllowance( networkId = networkId, tokenAddress = fromTokenAddress, - walletAddress = userWalletManager.getWalletAddress(networkId), + walletAddress = userWalletManager.getWalletAddress(networkId, derivationPath), ) return allowance.error == DataError.NoError && allowance.dataModel != ZERO_BALANCE } @@ -396,6 +403,7 @@ internal class SwapInteractorImpl @Inject constructor( currencyToSend = cryptoCurrencyConverter.convert(fromToken), destinationAddress = swapData.transaction.toWalletAddress, data = swapData.transaction.data, + derivationPath = derivationPath, ) val feeFiat = getFormattedFiatFee(networkId, feeData.fee.value) val formattedFee = amountFormatter.formatBigDecimalAmountToUI( @@ -513,6 +521,7 @@ internal class SwapInteractorImpl @Inject constructor( currencyToSend = userWalletManager.getNativeTokenForNetwork(networkId), destinationAddress = transactionData.toAddress, data = transactionData.data, + derivationPath = derivationPath, ) val feeFiat = getFormattedFiatFee(networkId, feeData.fee.value) val formattedFee = amountFormatter.formatBigDecimalAmountToUI( @@ -543,6 +552,7 @@ internal class SwapInteractorImpl @Inject constructor( userWalletManager.getCurrentWalletTokensBalance( networkId = networkId, extraTokens = tokensToSync.map { cryptoCurrencyConverter.convert(it) }, + derivationPath = derivationPath, ) cache.cacheBalances(tokensBalance.mapValues { SwapAmount(it.value.value, it.value.decimals) }) } @@ -558,7 +568,7 @@ internal class SwapInteractorImpl @Inject constructor( } private fun getWalletAddress(networkId: String): String { - return userWalletManager.getWalletAddress(networkId) + return userWalletManager.getWalletAddress(networkId, derivationPath) } private fun getTokenAddress(currency: Currency): String { @@ -581,7 +591,7 @@ internal class SwapInteractorImpl @Inject constructor( if (fee == null) { return false } - val nativeTokenBalance = userWalletManager.getNativeTokenBalance(networkId) + val nativeTokenBalance = userWalletManager.getNativeTokenBalance(networkId, derivationPath) val percentsToFeeIncrease = BigDecimal.valueOf(INCREASE_FEE_TO_CHECK_ENOUGH_PERCENT) return when (fromToken) { is Currency.NativeToken -> { diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt index fbece11798..d2d2622426 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt @@ -72,5 +72,6 @@ class SwapFragment : Fragment() { companion object { const val CURRENCY_BUNDLE_KEY = "swap_currency" + const val DERIVATION_PATH = "DERIVATION_STYLE" } } \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 47a659a127..b18ceab795 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -52,6 +52,7 @@ internal class SwapViewModel @Inject constructor( savedStateHandle[SwapFragment.CURRENCY_BUNDLE_KEY] ?: error("no expected parameter Currency found"), ) + private val derivationPath = savedStateHandle.get(SwapFragment.DERIVATION_PATH) private val stateBuilder = StateBuilder( actions = createUiActions(), @@ -78,6 +79,7 @@ internal class SwapViewModel @Inject constructor( get() = swapRouter.currentScreen init { + swapInteractor.initDerivationPath(derivationPath) initTokens(currency) } diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt index f167603b88..02c08a1d6b 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt @@ -8,6 +8,7 @@ import java.math.BigDecimal interface TransactionManager { + @Suppress("LongParameterList") @Throws(IllegalStateException::class) suspend fun sendApproveTransaction( networkId: String, @@ -15,6 +16,7 @@ interface TransactionManager { gasLimit: Int, destinationAddress: String, dataToSign: String, + derivationPath: String?, ): SendTxResult @Suppress("LongParameterList") @@ -28,8 +30,10 @@ interface TransactionManager { dataToSign: String, isSwap: Boolean, currencyToSend: Currency, + derivationPath: String?, ): SendTxResult + @Suppress("LongParameterList") @Throws(IllegalStateException::class) suspend fun getFee( networkId: String, @@ -37,13 +41,14 @@ interface TransactionManager { currencyToSend: Currency, destinationAddress: String, data: String?, + derivationPath: String?, ): ProxyFee @Throws(IllegalStateException::class) fun getNativeTokenDecimals(networkId: String): Int @Throws(IllegalStateException::class) - suspend fun updateWalletManager(networkId: String) + suspend fun updateWalletManager(networkId: String, derivationPath: String?) fun calculateFee(networkId: String, gasPrice: String, estimatedGas: Int): BigDecimal diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt index 258148f3ca..e9c0d1beea 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt @@ -29,15 +29,16 @@ interface UserWalletManager { * @param currency to receive referral payments */ @Throws(IllegalStateException::class) - suspend fun isTokenAdded(currency: Currency): Boolean + suspend fun isTokenAdded(currency: Currency, derivationPath: String?): Boolean /** * Adds token to wallet if its not * * @param currency to add to wallet + * @param derivationPath if null uses default */ @Throws(IllegalStateException::class) - suspend fun addToken(currency: Currency) + suspend fun addToken(currency: Currency, derivationPath: String?) fun refreshWallet() @@ -45,21 +46,27 @@ interface UserWalletManager { * Returns wallet public address for token * * @param networkId for currency + * @param derivationPath if null uses default */ @Throws(IllegalStateException::class) - fun getWalletAddress(networkId: String): String + fun getWalletAddress(networkId: String, derivationPath: String?): String /** * Return balances from wallet found by networkId * * @param networkId + * @param derivationPath if null uses default * @return map of */ @Throws(IllegalStateException::class) - suspend fun getCurrentWalletTokensBalance(networkId: String, extraTokens: List): Map + suspend fun getCurrentWalletTokensBalance( + networkId: String, + extraTokens: List, + derivationPath: String?, + ): Map @Throws(IllegalStateException::class) - fun getNativeTokenBalance(networkId: String): ProxyAmount? + fun getNativeTokenBalance(networkId: String, derivationPath: String?): ProxyAmount? /** * @param networkId @@ -74,5 +81,5 @@ interface UserWalletManager { fun getUserAppCurrency(): ProxyFiatCurrency @Throws(IllegalStateException::class) - fun getLastTransactionHash(networkId: String): String? + fun getLastTransactionHash(networkId: String, derivationPath: String?): String? } \ No newline at end of file