diff --git a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt index 72b36175ef..27d5a8a0fa 100644 --- a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt @@ -21,6 +21,7 @@ import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.operations.derivation.ExtendedPublicKeysMap import com.tangem.tap.domain.sdk.TangemSdkManager +import com.tangem.tap.domain.tasks.UserWalletIdPreflightReadFilter import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext import timber.log.Timber @@ -92,15 +93,20 @@ internal class DefaultDerivationsRepository( } override suspend fun derivePublicKeys(userWalletId: UserWalletId, derivations: Derivations): DerivedKeys { - tangemSdkManager.derivePublicKeys(cardId = null, derivations = derivations) - .doOnSuccess { response -> - updatePublicKeys(userWalletId = userWalletId, keys = response.entries) - .doOnSuccess { - validateDerivations(scanResponse = it.scanResponse, derivations = derivations) - return response.entries - } - .doOnFailure { throw it } - } + // todo replace it in task [REDACTED_JIRA] + val preflightReadFilter = UserWalletIdPreflightReadFilter(userWalletId) + tangemSdkManager.derivePublicKeys( + cardId = null, + derivations = derivations, + preflightReadFilter = preflightReadFilter, + ).doOnSuccess { response -> + updatePublicKeys(userWalletId = userWalletId, keys = response.entries) + .doOnSuccess { + validateDerivations(scanResponse = it.scanResponse, derivations = derivations) + return response.entries + } + .doOnFailure { throw it } + } .doOnFailure { throw it } error("This code should never be reached") diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt index 2dbfaec5b7..5ee23082e0 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/TangemSdkManager.kt @@ -17,6 +17,7 @@ import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.wallets.models.UserWalletId import com.tangem.operations.derivation.DerivationTaskResponse +import com.tangem.operations.preflightread.PreflightReadFilter import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.tap.domain.tasks.product.CreateProductWalletTaskResponse @@ -59,6 +60,7 @@ interface TangemSdkManager { suspend fun derivePublicKeys( cardId: String?, derivations: Map>, + preflightReadFilter: PreflightReadFilter?, ): CompletionResult suspend fun deriveExtendedPublicKey( @@ -99,6 +101,7 @@ interface TangemSdkManager { ) suspend fun runTaskAsync( runnable: CardSessionRunnable, + preflightReadFilter: PreflightReadFilter?, cardId: String? = null, initialMessage: Message? = null, accessCode: String? = null, diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt index 835a2fee69..8f9e869f0d 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/DefaultTangemSdkManager.kt @@ -30,6 +30,7 @@ import com.tangem.operations.derivation.DerivationTaskResponse import com.tangem.operations.derivation.DeriveMultipleWalletPublicKeysTask import com.tangem.operations.derivation.DeriveWalletPublicKeyTask import com.tangem.operations.pins.SetUserCodeCommand +import com.tangem.operations.preflightread.PreflightReadFilter import com.tangem.operations.usersetttings.SetUserCodeRecoveryAllowedTask import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.tap.derivationsFinder @@ -146,6 +147,7 @@ class DefaultTangemSdkManager( cardId = scanResponse.card.cardId, initialMessage = Message(resources.getString(R.string.initial_message_create_wallet_body)), iconScanRes = if (scanResponse.cardTypesResolver.isRing()) R.drawable.img_hand_scan_ring else null, + preflightReadFilter = null, ) } @@ -161,15 +163,16 @@ class DefaultTangemSdkManager( return CompletionResult.Failure(e) } return runTaskAsync( - CreateProductWalletTask( + runnable = CreateProductWalletTask( cardTypesResolver = scanResponse.cardTypesResolver, derivationStyleProvider = scanResponse.derivationStyleProvider, mnemonic = defaultMnemonic, passphrase = passphrase, shouldReset = shouldReset, ), - scanResponse.card.cardId, - Message(resources.getString(R.string.initial_message_create_wallet_body)), + cardId = scanResponse.card.cardId, + initialMessage = Message(resources.getString(R.string.initial_message_create_wallet_body)), + preflightReadFilter = null, ) } @@ -184,8 +187,13 @@ class DefaultTangemSdkManager( override suspend fun derivePublicKeys( cardId: String?, derivations: Map>, + preflightReadFilter: PreflightReadFilter?, ): CompletionResult { - return runTaskAsyncReturnOnMain(DeriveMultipleWalletPublicKeysTask(derivations), cardId) + return runTaskAsyncReturnOnMain( + runnable = DeriveMultipleWalletPublicKeysTask(derivations), + cardId = cardId, + preflightReadFilter = preflightReadFilter, + ) } override suspend fun deriveExtendedPublicKey( @@ -291,13 +299,21 @@ class DefaultTangemSdkManager( override suspend fun runTaskAsync( runnable: CardSessionRunnable, + preflightReadFilter: PreflightReadFilter?, cardId: String?, initialMessage: Message?, accessCode: String?, @DrawableRes iconScanRes: Int?, ): CompletionResult = withContext(Dispatchers.Main) { suspendCancellableCoroutine { continuation -> - tangemSdk.startSessionWithRunnable(runnable, cardId, initialMessage, accessCode, iconScanRes) { result -> + tangemSdk.startSessionWithRunnable( + runnable = runnable, + cardId = cardId, + initialMessage = initialMessage, + accessCode = accessCode, + preflightReadFilter = preflightReadFilter, + iconScanRes = iconScanRes, + ) { result -> if (continuation.isActive) continuation.resume(result) } } @@ -307,8 +323,14 @@ class DefaultTangemSdkManager( runnable: CardSessionRunnable, cardId: String? = null, initialMessage: Message? = null, + preflightReadFilter: PreflightReadFilter? = null, ): CompletionResult { - val result = runTaskAsync(runnable, cardId, initialMessage) + val result = runTaskAsync( + runnable = runnable, + cardId = cardId, + initialMessage = initialMessage, + preflightReadFilter = preflightReadFilter, + ) return withContext(Dispatchers.Main) { result } } @@ -360,6 +382,7 @@ class DefaultTangemSdkManager( runnable = CreateFirstTwinWalletTask(cardId), cardId = cardId, initialMessage = initialMessage, + preflightReadFilter = null, ) } @@ -378,7 +401,7 @@ class DefaultTangemSdkManager( preparingMessage = preparingMessage, creatingWalletMessage = creatingWalletMessage, ) - return runTaskAsync(task, null, initialMessage) + return runTaskAsync(runnable = task, cardId = null, initialMessage = initialMessage, preflightReadFilter = null) } override suspend fun finalizeTwin( @@ -391,6 +414,7 @@ class DefaultTangemSdkManager( runnable = FinalizeTwinTask(secondCardPublicKey, issuerKeyPair), cardId = cardId, initialMessage = initialMessage, + preflightReadFilter = null, ) } diff --git a/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt index 0dffc198a7..bddbaad9d6 100644 --- a/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/sdk/impl/MockTangemSdkManager.kt @@ -18,6 +18,7 @@ import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.wallets.models.UserWalletId import com.tangem.operations.derivation.DerivationTaskResponse +import com.tangem.operations.preflightread.PreflightReadFilter import com.tangem.operations.wallet.CreateWalletResponse import com.tangem.tap.domain.sdk.TangemSdkManager import com.tangem.tap.domain.sdk.mocks.MockProvider @@ -72,6 +73,7 @@ class MockTangemSdkManager( override suspend fun derivePublicKeys( cardId: String?, derivations: Map>, + preflightReadFilter: PreflightReadFilter?, ): CompletionResult { return MockProvider.getDerivationTaskResponse() } @@ -135,6 +137,7 @@ class MockTangemSdkManager( override suspend fun runTaskAsync( runnable: CardSessionRunnable, + preflightReadFilter: PreflightReadFilter?, cardId: String?, initialMessage: Message?, accessCode: String?, diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt index 288ca22a9d..096aa23b39 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ResetBackupCardTask.kt @@ -17,6 +17,7 @@ import com.tangem.tap.domain.tasks.UserWalletIdPreflightReadFilter * [REDACTED_AUTHOR] */ +// TODO remove it after test after resolve [REDACTED_JIRA] internal class ResetBackupCardTask( private val userWalletId: UserWalletId, ) : CardSessionRunnable { diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index deb7e332b7..0ee7f0e2ea 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -247,7 +247,14 @@ class WalletConnectSdkHelper { walletPublicKey = data.walletManager.wallet.publicKey.seedKey, derivationPath = data.walletManager.wallet.publicKey.derivationPath, ) - return when (val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId)) { + return when ( + val result = tangemSdkManager.runTaskAsync( + runnable = command, + initialMessage = Message(), + cardId = cardId, + preflightReadFilter = null, + ) + ) { is CompletionResult.Success -> { val hash = EthereumUtils.prepareTransactionToSend( signature = result.data.signature, @@ -290,7 +297,14 @@ class WalletConnectSdkHelper { walletPublicKey = wallet.publicKey.seedKey, derivationPath = wallet.publicKey.derivationPath, ) - return when (val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId)) { + return when ( + val result = tangemSdkManager.runTaskAsync( + runnable = command, + initialMessage = Message(), + cardId = cardId, + preflightReadFilter = null, + ) + ) { is CompletionResult.Success -> { val key = wallet.publicKey.blockchainKey.toDecompressedPublicKey() getBnbResultString( @@ -384,7 +398,13 @@ class WalletConnectSdkHelper { walletPublicKey = wallet.publicKey.seedKey, derivationPath = wallet.publicKey.derivationPath, ) - return when (val result = tangemSdkManager.runTaskAsync(command, cardId)) { + return when ( + val result = tangemSdkManager.runTaskAsync( + runnable = command, + cardId = cardId, + preflightReadFilter = null, + ) + ) { is CompletionResult.Success -> { val signedHash = result.data.signature @@ -419,7 +439,13 @@ class WalletConnectSdkHelper { walletPublicKey = wallet.publicKey.seedKey, derivationPath = wallet.publicKey.derivationPath, ) - return when (val result = tangemSdkManager.runTaskAsync(command, cardId)) { + return when ( + val result = tangemSdkManager.runTaskAsync( + runnable = command, + cardId = cardId, + preflightReadFilter = null, + ) + ) { is CompletionResult.Success -> { val signedHash = result.data.signature diff --git a/app/src/test/kotlin/com/tangem/tap/domain/card/DefaultDerivationsRepositoryTest.kt b/app/src/test/kotlin/com/tangem/tap/domain/card/DefaultDerivationsRepositoryTest.kt index 12be6b889d..93a58d5ba5 100644 --- a/app/src/test/kotlin/com/tangem/tap/domain/card/DefaultDerivationsRepositoryTest.kt +++ b/app/src/test/kotlin/com/tangem/tap/domain/card/DefaultDerivationsRepositoryTest.kt @@ -53,7 +53,7 @@ internal class DefaultDerivationsRepositoryTest { .onFailure { Truth.assertThat(it).isInstanceOf(IllegalStateException::class.java) } coVerify(exactly = 1) { userWalletsStore.getSyncOrNull(defaultUserWalletId) } - coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any()) } + coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any(), any()) } coVerify(inverse = true) { userWalletsStore.update(defaultUserWalletId, any()) } } @@ -67,7 +67,7 @@ internal class DefaultDerivationsRepositoryTest { .onFailure { error("Should returns success") } coVerify(exactly = 1) { userWalletsStore.getSyncOrNull(defaultUserWalletId) } - coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any()) } + coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any(), any()) } coVerify(inverse = true) { userWalletsStore.update(defaultUserWalletId, any()) } } @@ -84,7 +84,7 @@ internal class DefaultDerivationsRepositoryTest { .onFailure { error("Should returns success") } coVerify(exactly = 1) { userWalletsStore.getSyncOrNull(defaultUserWalletId) } - coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any()) } + coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any(), any()) } coVerify(inverse = true) { userWalletsStore.update(defaultUserWalletId, any()) } } @@ -110,7 +110,7 @@ internal class DefaultDerivationsRepositoryTest { .onFailure { error("Should returns success") } coVerify(exactly = 1) { userWalletsStore.getSyncOrNull(defaultUserWalletId) } - coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any()) } + coVerify(inverse = true) { tangemSdkManager.derivePublicKeys(null, any(), any()) } coVerify(inverse = true) { userWalletsStore.update(defaultUserWalletId, any()) } } @@ -120,7 +120,7 @@ internal class DefaultDerivationsRepositoryTest { scanResponse = ScanResponseMockFactory.create(cardConfig = MultiWalletCardConfig, derivedKeys = emptyMap()), ) coEvery { userWalletsStore.getSyncOrNull(defaultUserWalletId) } returns userWallet - coEvery { tangemSdkManager.derivePublicKeys(null, any()) } throws ScanCardException.UserCancelled + coEvery { tangemSdkManager.derivePublicKeys(null, any(), any()) } throws ScanCardException.UserCancelled runCatching { repository.derivePublicKeys( @@ -132,7 +132,7 @@ internal class DefaultDerivationsRepositoryTest { .onFailure { Truth.assertThat(it).isInstanceOf(ScanCardException.UserCancelled::class.java) } coVerify(exactly = 1) { userWalletsStore.getSyncOrNull(defaultUserWalletId) } - coVerify(exactly = 1) { tangemSdkManager.derivePublicKeys(null, any()) } + coVerify(exactly = 1) { tangemSdkManager.derivePublicKeys(null, any(), any()) } coVerify(inverse = true) { userWalletsStore.update(defaultUserWalletId, any()) } } @@ -143,7 +143,7 @@ internal class DefaultDerivationsRepositoryTest { scanResponse = ScanResponseMockFactory.create(cardConfig = MultiWalletCardConfig, derivedKeys = emptyMap()), ) coEvery { userWalletsStore.getSyncOrNull(defaultUserWalletId) } returns userWallet - coEvery { tangemSdkManager.derivePublicKeys(null, any()) } returns CompletionResult.Success( + coEvery { tangemSdkManager.derivePublicKeys(null, any(), any()) } returns CompletionResult.Success( DerivationTaskResponse(DerivedKeysMocks.ethereumDerivedKeys), ) coEvery { userWalletsStore.update(defaultUserWalletId, any()) } returns CompletionResult.Success(userWallet) @@ -155,10 +155,10 @@ internal class DefaultDerivationsRepositoryTest { ) } .onSuccess { Truth.assertThat(it) } - .onFailure { error("Should returns success") } + .onFailure { error("Should returns success but $it") } coVerify(exactly = 1) { userWalletsStore.getSyncOrNull(defaultUserWalletId) } - coVerify(exactly = 1) { tangemSdkManager.derivePublicKeys(null, any()) } + coVerify(exactly = 1) { tangemSdkManager.derivePublicKeys(null, any(), any()) } coVerify(exactly = 1) { userWalletsStore.update(defaultUserWalletId, any()) } } } \ No newline at end of file