From a38bc0322d4ceaeef24a3e62500ccdb4904bda49 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 3 Oct 2023 16:36:42 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/domain/TapWalletManager.kt | 42 ++++--- .../walletconnect/WalletConnectMiddleware.kt | 111 +++++++++++------- .../DefaultWalletManagersStore.kt | 4 + .../walletmanager/WalletManagersStore.kt | 2 + .../domain/common/extensions/Blockchain.kt | 2 - .../DefaultWalletManagersFacade.kt | 4 + .../walletmanager/WalletManagersFacade.kt | 2 + 7 files changed, 107 insertions(+), 60 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 c10b88280a..67f1253c9e 100644 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt @@ -92,11 +92,7 @@ class TapWalletManager( store.dispatchWalletAction(action = WalletAction.Warnings.CheckIfNeeded) } setupWalletConnectV2(userWallet) - - val walletFeatureToggles = store.state.daggerGraphState.get(DaggerGraphState::walletFeatureToggles) - if (!walletFeatureToggles.isRedesignedScreenEnabled) { - loadData(userWallet = userWallet, refresh = refresh) - } + loadData(userWallet = userWallet, refresh = refresh) } private fun Store.dispatchWalletAction(action: WalletAction) { @@ -161,21 +157,31 @@ class TapWalletManager( } } - private fun getAccountsForWc(wcInteractor: WalletConnectInteractor): List { - return store.state.walletState.walletManagers - .mapNotNull { - val wallet = it.wallet - val chainId = wcInteractor.blockchainHelper.networkIdToChainIdOrNull( - wallet.blockchain.toNetworkId(), + private suspend fun getAccountsForWc(wcInteractor: WalletConnectInteractor): List { + val walletManagerToggles = store.state.daggerGraphState + .get(DaggerGraphState::walletFeatureToggles) + val walletManagers = if (walletManagerToggles.isRedesignedScreenEnabled) { + val walletManagerFacade = store.state.daggerGraphState + .get(DaggerGraphState::walletManagersFacade) + val userWallet = userWalletsListManager.selectedUserWalletSync ?: return emptyList() + walletManagerFacade.getStoredWalletManagers(userWallet.walletId) + } else { + store.state.walletState.walletManagers + } + + return walletManagers.mapNotNull { + val wallet = it.wallet + val chainId = wcInteractor.blockchainHelper.networkIdToChainIdOrNull( + wallet.blockchain.toNetworkId(), + ) + chainId?.let { + Account( + chainId, + wallet.address, + wallet.publicKey.derivationPath?.rawPath, ) - chainId?.let { - Account( - chainId, - wallet.address, - wallet.publicKey.derivationPath?.rawPath, - ) - } } + } } fun updateConfigManager(data: ScanResponse) { diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index a436d55d8e..a9f177a893 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -32,6 +32,7 @@ import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.scope import com.tangem.tap.store +import com.tangem.tap.userWalletsListManager import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware @@ -246,47 +247,50 @@ class WalletConnectMiddleware { store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork())) return } - val walletManager = getWalletManager( - wallet = action.session.wallet, - blockchain = blockchain, - walletState = store.state.walletState, - ).guard { - store.dispatchOnMain( - GlobalAction.ShowDialog( - WalletConnectDialog.AddNetwork(blockchain.fullName), - ), + scope.launch { + val walletManager = getWalletManager( + wallet = action.session.wallet, + blockchain = blockchain, + walletState = store.state.walletState, + ).guard { + store.dispatchOnMain( + GlobalAction.ShowDialog( + WalletConnectDialog.AddNetwork(blockchain.fullName), + ), + ) + return@launch + } + val updatedWallet = action.session.wallet.copy( + walletPublicKey = walletManager.wallet.publicKey.seedKey, + derivedPublicKey = walletManager.wallet.publicKey.derivedKey, + derivationPath = walletManager.wallet.publicKey.derivationPath, + blockchain = action.blockchain, ) - return + val updatedSession = action.session.copy(wallet = updatedWallet) + store.dispatchOnMain(WalletConnectAction.UpdateBlockchain(updatedSession)) } - val updatedWallet = action.session.wallet.copy( - walletPublicKey = walletManager.wallet.publicKey.seedKey, - derivedPublicKey = walletManager.wallet.publicKey.derivedKey, - derivationPath = walletManager.wallet.publicKey.derivationPath, - blockchain = action.blockchain, - ) - val updatedSession = action.session.copy(wallet = updatedWallet) - store.dispatchOnMain(WalletConnectAction.UpdateBlockchain(updatedSession)) } is WalletConnectAction.UpdateBlockchain -> { walletConnectManager.updateBlockchain(action.updatedSession) } is WalletConnectAction.ApproveProposal -> { - val accounts = store.state.walletState.walletManagers - .mapNotNull { - val wallet = it.wallet - val chainId = walletConnectInteractor.blockchainHelper.networkIdToChainIdOrNull( - wallet.blockchain.toNetworkId(), - ) - chainId?.let { - Account( - chainId, - wallet.address, - wallet.publicKey.derivationPath?.rawPath, + scope.launch { + val accounts = getWalletManagers() + .mapNotNull { + val wallet = it.wallet + val chainId = walletConnectInteractor.blockchainHelper.networkIdToChainIdOrNull( + wallet.blockchain.toNetworkId(), ) + chainId?.let { + Account( + chainId, + wallet.address, + wallet.publicKey.derivationPath?.rawPath, + ) + } } - } - - walletConnectInteractor.approveSessionProposal(accounts) + walletConnectInteractor.approveSessionProposal(accounts) + } } is WalletConnectAction.RejectProposal -> { walletConnectInteractor.rejectSessionProposal() @@ -345,6 +349,19 @@ class WalletConnectMiddleware { } } + private suspend fun getWalletManagers(): List { + val walletManagerToggles = store.state.daggerGraphState + .get(DaggerGraphState::walletFeatureToggles) + return if (walletManagerToggles.isRedesignedScreenEnabled) { + val walletManagerFacade = store.state.daggerGraphState + .get(DaggerGraphState::walletManagersFacade) + val userWallet = userWalletsListManager.selectedUserWalletSync ?: return emptyList() + walletManagerFacade.getStoredWalletManagers(userWallet.walletId) + } else { + store.state.walletState.walletManagers + } + } + private fun scanCard(scanResponse: ScanResponse, session: WalletConnectSession, chainId: Int?) { val blockchain = WalletConnectNetworkUtils.parseBlockchain( chainId = chainId, @@ -430,7 +447,7 @@ class WalletConnectMiddleware { ) } - private fun getWalletManager( + private suspend fun getWalletManager( wallet: WalletForSession, blockchain: Blockchain, walletState: WalletState, @@ -440,15 +457,29 @@ class WalletConnectMiddleware { } else { blockchain } + val userWallet = userWalletsListManager.selectedUserWalletSync ?: return null val derivation = blockchainToMake.derivationPath( - style = store.state.globalState.scanResponse?.derivationStyleProvider?.getDerivationStyle(), + style = userWallet.scanResponse.derivationStyleProvider.getDerivationStyle(), )?.rawPath - val blockchainNetwork = BlockchainNetwork( - blockchain = blockchainToMake, - derivationPath = derivation, - tokens = emptyList(), - ) - return walletState.getWalletManager(blockchainNetwork) + val walletFeatureToggles = store.state.daggerGraphState + .get(DaggerGraphState::walletFeatureToggles) + + return if (walletFeatureToggles.isRedesignedScreenEnabled) { + val walletManagerFacade = store.state.daggerGraphState + .get(DaggerGraphState::walletManagersFacade) + walletManagerFacade.getOrCreateWalletManager( + userWalletId = userWallet.walletId, + blockchain = blockchainToMake, + derivationPath = derivation, + ) + } else { + val blockchainNetwork = BlockchainNetwork( + blockchain = blockchainToMake, + derivationPath = derivation, + tokens = emptyList(), + ) + walletState.getWalletManager(blockchainNetwork) + } } private fun isWalletConnectUri(uri: String): Boolean { diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/DefaultWalletManagersStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/DefaultWalletManagersStore.kt index 1222edafb4..f99db26624 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/DefaultWalletManagersStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/DefaultWalletManagersStore.kt @@ -33,6 +33,10 @@ internal class DefaultWalletManagersStore( } } + override suspend fun getAllSync(userWalletId: UserWalletId): List { + return getSyncOrNull(userWalletId) ?: emptyList() + } + override suspend fun store(userWalletId: UserWalletId, walletManager: WalletManager) { val walletManagers = getSyncOrNull(userWalletId) diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/WalletManagersStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/WalletManagersStore.kt index 8506eb5803..a820b1d7c9 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/WalletManagersStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/walletmanager/WalletManagersStore.kt @@ -15,6 +15,8 @@ interface WalletManagersStore { derivationPath: String?, ): WalletManager? + suspend fun getAllSync(userWalletId: UserWalletId): List + suspend fun store(userWalletId: UserWalletId, walletManager: WalletManager) suspend fun clear() diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 0970e85d77..a37ce82bcb 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -212,6 +212,4 @@ private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 private val excludedBlockchains = listOf( Blockchain.Unknown, Blockchain.Ducatus, - Blockchain.Telos, // disable in 4.9 - Blockchain.TelosTestnet, // disable in 4.9 ) \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt index 9851ae5bc8..01a025f741 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt @@ -221,6 +221,10 @@ class DefaultWalletManagersFacade( return walletManager } + override suspend fun getStoredWalletManagers(userWalletId: UserWalletId): List { + return walletManagersStore.getAllSync(userWalletId) + } + override suspend fun getAddress(userWalletId: UserWalletId, network: Network): List
{ val blockchain = Blockchain.fromId(network.id.value) diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt index 94ce68d1d3..2a30480141 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt @@ -77,6 +77,8 @@ interface WalletManagersFacade { derivationPath: String?, ): WalletManager? + suspend fun getStoredWalletManagers(userWalletId: UserWalletId): List + /** * Returns ordered list of addresses for selected wallet for given currency *