From af4fe942a50d0d774735c9f2854cb8fe6b38304c Mon Sep 17 00:00:00 2001 From: Matias Bzurovski Date: Wed, 17 Jul 2024 18:26:41 +0200 Subject: [PATCH] Handle user rejecting transaction on device --- .../LedgerHardwareWalletClient+Live.swift | 6 +++--- .../P2P+ConnectorExtension+Response.swift | 4 +++- .../Features/Signing/Children/SignWithFactorSource.swift | 8 ++++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/RadixWallet/Clients/LedgerHardwareWalletClient/LedgerHardwareWalletClient+Live.swift b/RadixWallet/Clients/LedgerHardwareWalletClient/LedgerHardwareWalletClient+Live.swift index 02cc310273..ddf73bda3d 100644 --- a/RadixWallet/Clients/LedgerHardwareWalletClient/LedgerHardwareWalletClient+Live.swift +++ b/RadixWallet/Clients/LedgerHardwareWalletClient/LedgerHardwareWalletClient+Live.swift @@ -48,7 +48,7 @@ extension LedgerHardwareWalletClient: DependencyKey { loggerGlobal.warning("Error from CE? \(errorFromConnectorExtension)") switch errorFromConnectorExtension.code { - case .generic: break + case .generic, .userRejectedSigningOfTransaction: break case .blindSigningNotEnabledButRequired: overlayWindowClient.scheduleAlertAndIgnoreAction( .init( @@ -136,8 +136,8 @@ extension LedgerHardwareWalletClient: DependencyKey { } }, signTransaction: { request in - let hashedMsg = try request.transactionIntent.hash() - let compiledTransactionIntent = try request.transactionIntent.compile() + let hashedMsg = request.transactionIntent.hash() + let compiledTransactionIntent = request.transactionIntent.compile() return try await sign( signers: request.signers, expectedHashedMessage: hashedMsg.hash.data diff --git a/RadixWallet/Core/SharedModels/P2P/ConnectorExtension/P2P+ConnectorExtension+Response.swift b/RadixWallet/Core/SharedModels/P2P/ConnectorExtension/P2P+ConnectorExtension+Response.swift index 620d30f189..2f2c7cc9b3 100644 --- a/RadixWallet/Core/SharedModels/P2P/ConnectorExtension/P2P+ConnectorExtension+Response.swift +++ b/RadixWallet/Core/SharedModels/P2P/ConnectorExtension/P2P+ConnectorExtension+Response.swift @@ -33,9 +33,11 @@ extension P2P.ConnectorExtension.Response.LedgerHardwareWallet { public enum Reason: Int, Sendable, Hashable, Decodable { case generic = 0 case blindSigningNotEnabledButRequired = 1 + case userRejectedSigningOfTransaction = 2 + public var userFacingErrorDescription: String { switch self { - case .generic: + case .generic, .userRejectedSigningOfTransaction: L10n.Error.TransactionFailure.unknown case .blindSigningNotEnabledButRequired: L10n.Error.TransactionFailure.blindSigningNotEnabledButRequired diff --git a/RadixWallet/Features/Signing/Children/SignWithFactorSource.swift b/RadixWallet/Features/Signing/Children/SignWithFactorSource.swift index 46b095e14f..1cff57cae6 100644 --- a/RadixWallet/Features/Signing/Children/SignWithFactorSource.swift +++ b/RadixWallet/Features/Signing/Children/SignWithFactorSource.swift @@ -96,9 +96,13 @@ public struct SignWithFactorSource: Sendable, FeatureReducer { try await sign(signers: signingFactor.signers, factor: signingFactor.factorSource.extract(as: LedgerHardwareWalletFactorSource.self), state: state) } allSignatures.append(contentsOf: signatures) - } catch { + } catch let error as P2P.ConnectorExtension.Response.LedgerHardwareWallet.Failure where error.code == .userRejectedSigningOfTransaction { + // If user rejected transaction on ledger device, we will inform the delegate to dismiss the signing sheet. await send(.delegate(.failedToSign(signingFactor))) - break + return + } catch { + // In any other type of error, we will just allow them to retry. + return } } await send(.delegate(.done(signingFactors: signingFactors, signatures: allSignatures)))