From 9856a19e65cc1dd41f817b6de9fb647f912055a0 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 10:14:28 +0200 Subject: [PATCH 01/10] Update auth client --- Sources/Auth/AuthClient.swift | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index a9c751104..b21e5700b 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -1,6 +1,20 @@ import Foundation +import JSONRPC +import Combine + +typealias RPCID = JSONRPC.RPCID class AuthClient { + private var authRequestPublisherSubject = PassthroughSubject<(id: RPCID, message: String), Never>() + public var authRequestPublisher: AnyPublisher<(id: RPCID, message: String), Never> { + authRequestPublisherSubject.eraseToAnyPublisher() + } + + private var authResponsePublisherSubject = PassthroughSubject<(id: RPCID, cacao: Cacao), Never>() + public var authResponsePublisher: AnyPublisher<(id: RPCID, cacao: Cacao), Never> { + authResponsePublisherSubject.eraseToAnyPublisher() + } + enum Errors: Error { case malformedPairingURI } @@ -16,16 +30,24 @@ class AuthClient { self.walletPairService = walletPairService } - func request(params: RequestParams) async throws -> String { + public func pair(uri: String) async throws { + guard let pairingURI = WalletConnectURI(string: uri) else { + throw Errors.malformedPairingURI + } + try await walletPairService.pair(pairingURI) + } + + public func request(_ params: RequestParams) async throws -> String { let uri = try await appPairService.create() try await appRequestService.request(params: params, topic: uri.topic) return uri.absoluteString } - func pair(uri: String) async throws { - guard let pairingURI = WalletConnectURI(string: uri) else { - throw Errors.malformedPairingURI - } - try await walletPairService.pair(pairingURI) + public func respond(_ params: RespondParams) async throws { + fatalError("not implemented") + } + + public func getPendingRequests() -> [Request] { + fatalError("not implemented") } } From 861ba777baacb08fb9b1343ba938c4ef0c3ed089 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 10:27:36 +0200 Subject: [PATCH 02/10] update auth client rename services --- Sources/Auth/AuthClient.swift | 24 ++++++++++++++----- ...tService.swift => AppRequestService.swift} | 2 +- ...riber.swift => AppRespondSubscriber.swift} | 2 +- ...er.swift => WalletRequestSubscriber.swift} | 2 +- ...rvice.swift => WalletRespondService.swift} | 2 +- Sources/Auth/Types/RPCID.swift | 4 ++++ .../AuthTests/AuthRequstSubscriberTests.swift | 4 ++-- 7 files changed, 28 insertions(+), 12 deletions(-) rename Sources/Auth/Services/App/{AuthRequestService.swift => AppRequestService.swift} (97%) rename Sources/Auth/Services/App/{AuthRespondSubscriber.swift => AppRespondSubscriber.swift} (98%) rename Sources/Auth/Services/Wallet/{AuthRequestSubscriber.swift => WalletRequestSubscriber.swift} (97%) rename Sources/Auth/Services/Wallet/{AuthRespondService.swift => WalletRespondService.swift} (98%) create mode 100644 Sources/Auth/Types/RPCID.swift diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index b21e5700b..371d3a436 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -1,9 +1,6 @@ import Foundation -import JSONRPC import Combine -typealias RPCID = JSONRPC.RPCID - class AuthClient { private var authRequestPublisherSubject = PassthroughSubject<(id: RPCID, message: String), Never>() public var authRequestPublisher: AnyPublisher<(id: RPCID, message: String), Never> { @@ -20,14 +17,25 @@ class AuthClient { } private let appPairService: AppPairService - private let appRequestService: AuthRequestService + private let appRequestService: AppRequestService + private let appRespondSubscriber: AppRespondSubscriber private let walletPairService: WalletPairService + private let walletRequestSubscriber: WalletRequestSubscriber + private let walletRespondService: WalletRespondService - init(appPairService: AppPairService, appRequestService: AuthRequestService, walletPairService: WalletPairService) { + init(appPairService: AppPairService, + appRequestService: AppRequestService, + appRespondSubscriber: AppRespondSubscriber, + walletPairService: WalletPairService, + walletRequestSubscriber: WalletRequestSubscriber, + walletRespondService: WalletRespondService) { self.appPairService = appPairService self.appRequestService = appRequestService self.walletPairService = walletPairService + self.walletRequestSubscriber = walletRequestSubscriber + self.walletRespondService = walletRespondService + self.appRespondSubscriber = appRespondSubscriber } public func pair(uri: String) async throws { @@ -47,7 +55,11 @@ class AuthClient { fatalError("not implemented") } - public func getPendingRequests() -> [Request] { + public func getPendingRequests() -> [AuthRequest] { fatalError("not implemented") } } + +public struct AuthRequest: Equatable, Codable { + +} diff --git a/Sources/Auth/Services/App/AuthRequestService.swift b/Sources/Auth/Services/App/AppRequestService.swift similarity index 97% rename from Sources/Auth/Services/App/AuthRequestService.swift rename to Sources/Auth/Services/App/AppRequestService.swift index b82d5259b..1220a7155 100644 --- a/Sources/Auth/Services/App/AuthRequestService.swift +++ b/Sources/Auth/Services/App/AppRequestService.swift @@ -3,7 +3,7 @@ import WalletConnectUtils import WalletConnectKMS import JSONRPC -actor AuthRequestService { +actor AppRequestService { private let networkingInteractor: NetworkInteracting private let appMetadata: AppMetadata private let kms: KeyManagementService diff --git a/Sources/Auth/Services/App/AuthRespondSubscriber.swift b/Sources/Auth/Services/App/AppRespondSubscriber.swift similarity index 98% rename from Sources/Auth/Services/App/AuthRespondSubscriber.swift rename to Sources/Auth/Services/App/AppRespondSubscriber.swift index a6f1f8b57..d8695b98a 100644 --- a/Sources/Auth/Services/App/AuthRespondSubscriber.swift +++ b/Sources/Auth/Services/App/AppRespondSubscriber.swift @@ -3,7 +3,7 @@ import Foundation import WalletConnectUtils import JSONRPC -class AuthRespondSubscriber { +class AppRespondSubscriber { private let networkingInteractor: NetworkInteracting private let logger: ConsoleLogging private let rpcHistory: RPCHistory diff --git a/Sources/Auth/Services/Wallet/AuthRequestSubscriber.swift b/Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift similarity index 97% rename from Sources/Auth/Services/Wallet/AuthRequestSubscriber.swift rename to Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift index e4acc5b04..fb5510d1f 100644 --- a/Sources/Auth/Services/Wallet/AuthRequestSubscriber.swift +++ b/Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift @@ -3,7 +3,7 @@ import Foundation import WalletConnectUtils import JSONRPC -class AuthRequestSubscriber { +class WalletRequestSubscriber { private let networkingInteractor: NetworkInteracting private let logger: ConsoleLogging private let address: String diff --git a/Sources/Auth/Services/Wallet/AuthRespondService.swift b/Sources/Auth/Services/Wallet/WalletRespondService.swift similarity index 98% rename from Sources/Auth/Services/Wallet/AuthRespondService.swift rename to Sources/Auth/Services/Wallet/WalletRespondService.swift index 006459d37..f62e852da 100644 --- a/Sources/Auth/Services/Wallet/AuthRespondService.swift +++ b/Sources/Auth/Services/Wallet/WalletRespondService.swift @@ -3,7 +3,7 @@ import WalletConnectKMS import JSONRPC import WalletConnectUtils -actor AuthRespondService { +actor WalletRespondService { enum Errors: Error { case recordForIdNotFound case malformedAuthRequestParams diff --git a/Sources/Auth/Types/RPCID.swift b/Sources/Auth/Types/RPCID.swift new file mode 100644 index 000000000..ca206cf81 --- /dev/null +++ b/Sources/Auth/Types/RPCID.swift @@ -0,0 +1,4 @@ +import Foundation +import JSONRPC + +typealias RPCID = JSONRPC.RPCID diff --git a/Tests/AuthTests/AuthRequstSubscriberTests.swift b/Tests/AuthTests/AuthRequstSubscriberTests.swift index 990a9cb4f..dbf7bba20 100644 --- a/Tests/AuthTests/AuthRequstSubscriberTests.swift +++ b/Tests/AuthTests/AuthRequstSubscriberTests.swift @@ -8,14 +8,14 @@ import JSONRPC class AuthRequstSubscriberTests: XCTestCase { var networkingInteractor: NetworkingInteractorMock! - var sut: AuthRequestSubscriber! + var sut: WalletRequestSubscriber! var messageFormatter: SIWEMessageFormatterMock! let defaultTimeout: TimeInterval = 0.01 override func setUp() { networkingInteractor = NetworkingInteractorMock() messageFormatter = SIWEMessageFormatterMock() - sut = AuthRequestSubscriber(networkingInteractor: networkingInteractor, + sut = WalletRequestSubscriber(networkingInteractor: networkingInteractor, logger: ConsoleLoggerMock(), messageFormatter: messageFormatter, address: "") } From 66c756e0ac317c96922e0dbb429cac8cb81dd3d5 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 11:39:12 +0200 Subject: [PATCH 03/10] update Auth client --- Sources/Auth/AuthClient.swift | 38 +++++++++++++------ .../Auth/Services/Common/CacaoFormatter.swift | 4 +- .../Wallet/WalletRespondService.swift | 4 +- Sources/Auth/Types/Aliases/Account.swift | 4 ++ .../Types/{ => Aliases}/AppMetadata.swift | 0 Sources/Auth/Types/Aliases/RPCID.swift | 4 ++ .../{ => Aliases}/WalletConnectURI.swift | 0 Sources/Auth/Types/Public/AuthRequest.swift | 7 ++++ Sources/Auth/Types/RPCID.swift | 4 -- Sources/WalletConnectUtils/RPCHistory.swift | 4 ++ 10 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 Sources/Auth/Types/Aliases/Account.swift rename Sources/Auth/Types/{ => Aliases}/AppMetadata.swift (100%) create mode 100644 Sources/Auth/Types/Aliases/RPCID.swift rename Sources/Auth/Types/{ => Aliases}/WalletConnectURI.swift (100%) create mode 100644 Sources/Auth/Types/Public/AuthRequest.swift delete mode 100644 Sources/Auth/Types/RPCID.swift diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index 371d3a436..7a3bfd07c 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -1,7 +1,13 @@ import Foundation import Combine +import JSONRPC +import WalletConnectUtils class AuthClient { + enum Errors: Error { + case malformedPairingURI + case UnknownWalletAddress + } private var authRequestPublisherSubject = PassthroughSubject<(id: RPCID, message: String), Never>() public var authRequestPublisher: AnyPublisher<(id: RPCID, message: String), Never> { authRequestPublisherSubject.eraseToAnyPublisher() @@ -11,10 +17,7 @@ class AuthClient { public var authResponsePublisher: AnyPublisher<(id: RPCID, cacao: Cacao), Never> { authResponsePublisherSubject.eraseToAnyPublisher() } - - enum Errors: Error { - case malformedPairingURI - } + private let rpcHistory: RPCHistory private let appPairService: AppPairService private let appRequestService: AppRequestService @@ -24,18 +27,24 @@ class AuthClient { private let walletRequestSubscriber: WalletRequestSubscriber private let walletRespondService: WalletRespondService + private var account: Account? + init(appPairService: AppPairService, appRequestService: AppRequestService, appRespondSubscriber: AppRespondSubscriber, walletPairService: WalletPairService, walletRequestSubscriber: WalletRequestSubscriber, - walletRespondService: WalletRespondService) { + walletRespondService: WalletRespondService, + account: Account, + rpcHistory: RPCHistory) { self.appPairService = appPairService self.appRequestService = appRequestService self.walletPairService = walletPairService self.walletRequestSubscriber = walletRequestSubscriber self.walletRespondService = walletRespondService self.appRespondSubscriber = appRespondSubscriber + self.account = account + self.rpcHistory = rpcHistory } public func pair(uri: String) async throws { @@ -52,14 +61,19 @@ class AuthClient { } public func respond(_ params: RespondParams) async throws { - fatalError("not implemented") + guard let account = account else { throw Errors.UnknownWalletAddress } + try await walletRespondService.respond(respondParams: params, account: account) } - public func getPendingRequests() -> [AuthRequest] { - fatalError("not implemented") + public func getPendingRequests() throws -> [AuthRequest] { + guard let account = account else { throw Errors.UnknownWalletAddress } + let pendingRequests: [AuthRequest] = rpcHistory.getPending() + .filter {$0.request.method == "wc_authRequest"} + .compactMap { + guard let params = try? $0.request.params?.get(AuthRequestParams.self) else {return nil} + let message = SIWEMessageFormatter().formatMessage(from: params.payloadParams, address: account.address) + return AuthRequest(id: $0.request.id!, message: message) + } + return pendingRequests } } - -public struct AuthRequest: Equatable, Codable { - -} diff --git a/Sources/Auth/Services/Common/CacaoFormatter.swift b/Sources/Auth/Services/Common/CacaoFormatter.swift index 43ddb9058..c35286b87 100644 --- a/Sources/Auth/Services/Common/CacaoFormatter.swift +++ b/Sources/Auth/Services/Common/CacaoFormatter.swift @@ -2,11 +2,11 @@ import Foundation import WalletConnectUtils protocol CacaoFormatting { - func format(_ request: AuthRequestParams, _ signature: CacaoSignature, _ issuer: Account) -> Cacao + func format(_ request: AuthRequestParams, _ signature: CacaoSignature, _ account: Account) -> Cacao } class CacaoFormatter: CacaoFormatting { - func format(_ request: AuthRequestParams, _ signature: CacaoSignature, _ issuer: Account) -> Cacao { + func format(_ request: AuthRequestParams, _ signature: CacaoSignature, _ account: Account) -> Cacao { fatalError("not implemented") } } diff --git a/Sources/Auth/Services/Wallet/WalletRespondService.swift b/Sources/Auth/Services/Wallet/WalletRespondService.swift index f62e852da..81a37db03 100644 --- a/Sources/Auth/Services/Wallet/WalletRespondService.swift +++ b/Sources/Auth/Services/Wallet/WalletRespondService.swift @@ -23,7 +23,7 @@ actor WalletRespondService { self.rpcHistory = rpcHistory } - func respond(respondParams: RespondParams, issuer: Account) async throws { + func respond(respondParams: RespondParams, account: Account) async throws { guard let request = rpcHistory.get(recordId: RPCID(respondParams.id))?.request else { throw Errors.recordForIdNotFound } guard let authRequestParams = try? request.params?.get(AuthRequestParams.self) else { throw Errors.malformedAuthRequestParams } @@ -33,7 +33,7 @@ actor WalletRespondService { let agreementKeys = try kms.performKeyAgreement(selfPublicKey: selfPubKey, peerPublicKey: peerPubKey) try kms.setAgreementSecret(agreementKeys, topic: responseTopic) - let cacao = CacaoFormatter().format(authRequestParams, respondParams.signature, issuer) + let cacao = CacaoFormatter().format(authRequestParams, respondParams.signature, account) let response = RPCResponse(id: request.id!, result: cacao) try await networkingInteractor.respond(topic: respondParams.topic, response: response, tag: AuthResponseParams.tag, envelopeType: .type1(pubKey: selfPubKey.rawRepresentation)) diff --git a/Sources/Auth/Types/Aliases/Account.swift b/Sources/Auth/Types/Aliases/Account.swift new file mode 100644 index 000000000..84759e639 --- /dev/null +++ b/Sources/Auth/Types/Aliases/Account.swift @@ -0,0 +1,4 @@ +import WalletConnectUtils +import Foundation + +typealias Account = WalletConnectUtils.Account diff --git a/Sources/Auth/Types/AppMetadata.swift b/Sources/Auth/Types/Aliases/AppMetadata.swift similarity index 100% rename from Sources/Auth/Types/AppMetadata.swift rename to Sources/Auth/Types/Aliases/AppMetadata.swift diff --git a/Sources/Auth/Types/Aliases/RPCID.swift b/Sources/Auth/Types/Aliases/RPCID.swift new file mode 100644 index 000000000..51cb31cdd --- /dev/null +++ b/Sources/Auth/Types/Aliases/RPCID.swift @@ -0,0 +1,4 @@ +import Foundation +import JSONRPC + +public typealias RPCID = JSONRPC.RPCID diff --git a/Sources/Auth/Types/WalletConnectURI.swift b/Sources/Auth/Types/Aliases/WalletConnectURI.swift similarity index 100% rename from Sources/Auth/Types/WalletConnectURI.swift rename to Sources/Auth/Types/Aliases/WalletConnectURI.swift diff --git a/Sources/Auth/Types/Public/AuthRequest.swift b/Sources/Auth/Types/Public/AuthRequest.swift new file mode 100644 index 000000000..f431ccb4d --- /dev/null +++ b/Sources/Auth/Types/Public/AuthRequest.swift @@ -0,0 +1,7 @@ +import Foundation + +public struct AuthRequest: Equatable, Codable { + public let id: RPCID + /// EIP-4361: Sign-In with Ethereum message + public let message: String +} diff --git a/Sources/Auth/Types/RPCID.swift b/Sources/Auth/Types/RPCID.swift deleted file mode 100644 index ca206cf81..000000000 --- a/Sources/Auth/Types/RPCID.swift +++ /dev/null @@ -1,4 +0,0 @@ -import Foundation -import JSONRPC - -typealias RPCID = JSONRPC.RPCID diff --git a/Sources/WalletConnectUtils/RPCHistory.swift b/Sources/WalletConnectUtils/RPCHistory.swift index 8112cacc3..d0707688d 100644 --- a/Sources/WalletConnectUtils/RPCHistory.swift +++ b/Sources/WalletConnectUtils/RPCHistory.swift @@ -64,4 +64,8 @@ public final class RPCHistory { } } } + + public func getPending() -> [Record] { + storage.getAll().filter {$0.response == nil} + } } From a3518d986b5d218c1649fe819fc510d00584e353 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 13:28:24 +0200 Subject: [PATCH 04/10] update auth client --- Sources/Auth/AuthClient.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index 7a3bfd07c..69338c7cf 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -45,6 +45,7 @@ class AuthClient { self.appRespondSubscriber = appRespondSubscriber self.account = account self.rpcHistory = rpcHistory + setUpPublishers() } public func pair(uri: String) async throws { @@ -76,4 +77,15 @@ class AuthClient { } return pendingRequests } + + private func setUpPublishers() { + appRespondSubscriber.onResponse = { [unowned self] (id, cacao) in + authResponsePublisherSubject.send((id, cacao)) + } + + walletRequestSubscriber.onRequest = { [unowned self] (id, message) in + authRequestPublisherSubject.send((id, message)) + } + } + } From d4e115682c3d139321647a9ae97ed0ba11380e0e Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 13:28:58 +0200 Subject: [PATCH 05/10] remove uikit import from sign client --- Sources/WalletConnectSign/Sign/SignClient.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/Sources/WalletConnectSign/Sign/SignClient.swift b/Sources/WalletConnectSign/Sign/SignClient.swift index 1dc88cae2..43df10383 100644 --- a/Sources/WalletConnectSign/Sign/SignClient.swift +++ b/Sources/WalletConnectSign/Sign/SignClient.swift @@ -3,9 +3,6 @@ import WalletConnectRelay import WalletConnectUtils import WalletConnectKMS import Combine -#if os(iOS) -import UIKit -#endif /// An Object that expose public API to provide interactions with WalletConnect SDK /// From 146192c3973d3ec38aff9684e3590a41e5c034b3 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 13:35:58 +0200 Subject: [PATCH 06/10] Add cleanup service --- Sources/Auth/AuthClient.swift | 16 +++++++++++++-- .../Auth/Services/Common/CleanupService.swift | 20 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 Sources/Auth/Services/Common/CleanupService.swift diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index 69338c7cf..89445d071 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -26,6 +26,7 @@ class AuthClient { private let walletPairService: WalletPairService private let walletRequestSubscriber: WalletRequestSubscriber private let walletRespondService: WalletRespondService + private let cleanupService: CleanupService private var account: Account? @@ -36,7 +37,8 @@ class AuthClient { walletRequestSubscriber: WalletRequestSubscriber, walletRespondService: WalletRespondService, account: Account, - rpcHistory: RPCHistory) { + rpcHistory: RPCHistory, + cleanupService: CleanupService) { self.appPairService = appPairService self.appRequestService = appRequestService self.walletPairService = walletPairService @@ -45,6 +47,8 @@ class AuthClient { self.appRespondSubscriber = appRespondSubscriber self.account = account self.rpcHistory = rpcHistory + self.cleanupService = cleanupService + setUpPublishers() } @@ -78,6 +82,15 @@ class AuthClient { return pendingRequests } +#if DEBUG + /// Delete all stored data sach as: pairings, sessions, keys + /// + /// - Note: Doesn't unsubscribe from topics + public func cleanup() throws { + try cleanupService.cleanup() + } +#endif + private func setUpPublishers() { appRespondSubscriber.onResponse = { [unowned self] (id, cacao) in authResponsePublisherSubject.send((id, cacao)) @@ -87,5 +100,4 @@ class AuthClient { authRequestPublisherSubject.send((id, message)) } } - } diff --git a/Sources/Auth/Services/Common/CleanupService.swift b/Sources/Auth/Services/Common/CleanupService.swift new file mode 100644 index 000000000..dac2b63c5 --- /dev/null +++ b/Sources/Auth/Services/Common/CleanupService.swift @@ -0,0 +1,20 @@ +import Foundation +import WalletConnectKMS +import WalletConnectUtils +import WalletConnectPairing + +final class CleanupService { + + private let pairingStore: WCPairingStorage + private let kms: KeyManagementServiceProtocol + + init(pairingStore: WCPairingStorage, kms: KeyManagementServiceProtocol, sessionToPairingTopic: CodableStore) { + self.pairingStore = pairingStore + self.kms = kms + } + + func cleanup() throws { + pairingStore.deleteAll() + try kms.deleteAll() + } +} From 94dd0c08a501730d8756541c1b86e0e09f21ce99 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 13:36:58 +0200 Subject: [PATCH 07/10] update auth client - account optional --- Sources/Auth/AuthClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index 89445d071..fd3fbf115 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -36,7 +36,7 @@ class AuthClient { walletPairService: WalletPairService, walletRequestSubscriber: WalletRequestSubscriber, walletRespondService: WalletRespondService, - account: Account, + account: Account?, rpcHistory: RPCHistory, cleanupService: CleanupService) { self.appPairService = appPairService From ce73441cfa82477dbb4fc9be3378d5ac85c3d743 Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Wed, 10 Aug 2022 13:48:29 +0200 Subject: [PATCH 08/10] Update request method --- Sources/Auth/AuthClient.swift | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index fd3fbf115..9f73d464d 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -2,11 +2,13 @@ import Foundation import Combine import JSONRPC import WalletConnectUtils +import WalletConnectPairing class AuthClient { enum Errors: Error { case malformedPairingURI - case UnknownWalletAddress + case unknownWalletAddress + case noPairingMatchingTopic } private var authRequestPublisherSubject = PassthroughSubject<(id: RPCID, message: String), Never>() public var authRequestPublisher: AnyPublisher<(id: RPCID, message: String), Never> { @@ -27,6 +29,8 @@ class AuthClient { private let walletRequestSubscriber: WalletRequestSubscriber private let walletRespondService: WalletRespondService private let cleanupService: CleanupService + private let pairingStorage: WCPairingStorage + public let logger: ConsoleLogging private var account: Account? @@ -38,7 +42,9 @@ class AuthClient { walletRespondService: WalletRespondService, account: Account?, rpcHistory: RPCHistory, - cleanupService: CleanupService) { + cleanupService: CleanupService, + logger: ConsoleLogging, + pairingStorage: WCPairingStorage) { self.appPairService = appPairService self.appRequestService = appRequestService self.walletPairService = walletPairService @@ -48,6 +54,8 @@ class AuthClient { self.account = account self.rpcHistory = rpcHistory self.cleanupService = cleanupService + self.logger = logger + self.pairingStorage = pairingStorage setUpPublishers() } @@ -59,19 +67,29 @@ class AuthClient { try await walletPairService.pair(pairingURI) } - public func request(_ params: RequestParams) async throws -> String { - let uri = try await appPairService.create() - try await appRequestService.request(params: params, topic: uri.topic) - return uri.absoluteString + public func request(_ params: RequestParams, topic: String?) async throws -> String? { + logger.debug("Requesting Authentication") + if let topic = topic { + guard pairingStorage.hasPairing(forTopic: topic) else { + throw Errors.noPairingMatchingTopic + } + logger.debug("Requesting on existing pairing") + try await appRequestService.request(params: params, topic: topic) + return nil + } else { + let uri = try await appPairService.create() + try await appRequestService.request(params: params, topic: uri.topic) + return uri.absoluteString + } } public func respond(_ params: RespondParams) async throws { - guard let account = account else { throw Errors.UnknownWalletAddress } + guard let account = account else { throw Errors.unknownWalletAddress } try await walletRespondService.respond(respondParams: params, account: account) } public func getPendingRequests() throws -> [AuthRequest] { - guard let account = account else { throw Errors.UnknownWalletAddress } + guard let account = account else { throw Errors.unknownWalletAddress } let pendingRequests: [AuthRequest] = rpcHistory.getPending() .filter {$0.request.method == "wc_authRequest"} .compactMap { From 2bb37432c97bcd68f7702d2dedeb1ddf2e2efa3a Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Thu, 11 Aug 2022 09:00:21 +0200 Subject: [PATCH 09/10] Add pending requests provider split request method into two --- Sources/Auth/AuthClient.swift | 40 ++++++++----------- .../Wallet/PendingRequestsProvider.swift | 22 ++++++++++ 2 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 Sources/Auth/Services/Wallet/PendingRequestsProvider.swift diff --git a/Sources/Auth/AuthClient.swift b/Sources/Auth/AuthClient.swift index 9f73d464d..6ea7bc053 100644 --- a/Sources/Auth/AuthClient.swift +++ b/Sources/Auth/AuthClient.swift @@ -1,6 +1,5 @@ import Foundation import Combine -import JSONRPC import WalletConnectUtils import WalletConnectPairing @@ -19,7 +18,6 @@ class AuthClient { public var authResponsePublisher: AnyPublisher<(id: RPCID, cacao: Cacao), Never> { authResponsePublisherSubject.eraseToAnyPublisher() } - private let rpcHistory: RPCHistory private let appPairService: AppPairService private let appRequestService: AppRequestService @@ -30,6 +28,7 @@ class AuthClient { private let walletRespondService: WalletRespondService private let cleanupService: CleanupService private let pairingStorage: WCPairingStorage + private let pendingRequestsProvider: PendingRequestsProvider public let logger: ConsoleLogging private var account: Account? @@ -41,7 +40,7 @@ class AuthClient { walletRequestSubscriber: WalletRequestSubscriber, walletRespondService: WalletRespondService, account: Account?, - rpcHistory: RPCHistory, + pendingRequestsProvider: PendingRequestsProvider, cleanupService: CleanupService, logger: ConsoleLogging, pairingStorage: WCPairingStorage) { @@ -52,7 +51,7 @@ class AuthClient { self.walletRespondService = walletRespondService self.appRespondSubscriber = appRespondSubscriber self.account = account - self.rpcHistory = rpcHistory + self.pendingRequestsProvider = pendingRequestsProvider self.cleanupService = cleanupService self.logger = logger self.pairingStorage = pairingStorage @@ -67,20 +66,19 @@ class AuthClient { try await walletPairService.pair(pairingURI) } - public func request(_ params: RequestParams, topic: String?) async throws -> String? { + public func request(_ params: RequestParams) async throws -> String { logger.debug("Requesting Authentication") - if let topic = topic { - guard pairingStorage.hasPairing(forTopic: topic) else { - throw Errors.noPairingMatchingTopic - } - logger.debug("Requesting on existing pairing") - try await appRequestService.request(params: params, topic: topic) - return nil - } else { - let uri = try await appPairService.create() - try await appRequestService.request(params: params, topic: uri.topic) - return uri.absoluteString + let uri = try await appPairService.create() + try await appRequestService.request(params: params, topic: uri.topic) + return uri.absoluteString + } + + public func request(_ params: RequestParams, topic: String) async throws { + logger.debug("Requesting Authentication on existing pairing") + guard pairingStorage.hasPairing(forTopic: topic) else { + throw Errors.noPairingMatchingTopic } + try await appRequestService.request(params: params, topic: topic) } public func respond(_ params: RespondParams) async throws { @@ -90,14 +88,7 @@ class AuthClient { public func getPendingRequests() throws -> [AuthRequest] { guard let account = account else { throw Errors.unknownWalletAddress } - let pendingRequests: [AuthRequest] = rpcHistory.getPending() - .filter {$0.request.method == "wc_authRequest"} - .compactMap { - guard let params = try? $0.request.params?.get(AuthRequestParams.self) else {return nil} - let message = SIWEMessageFormatter().formatMessage(from: params.payloadParams, address: account.address) - return AuthRequest(id: $0.request.id!, message: message) - } - return pendingRequests + return try pendingRequestsProvider.getPendingRequests(account: account) } #if DEBUG @@ -119,3 +110,4 @@ class AuthClient { } } } + diff --git a/Sources/Auth/Services/Wallet/PendingRequestsProvider.swift b/Sources/Auth/Services/Wallet/PendingRequestsProvider.swift new file mode 100644 index 000000000..16fe22128 --- /dev/null +++ b/Sources/Auth/Services/Wallet/PendingRequestsProvider.swift @@ -0,0 +1,22 @@ +import Foundation +import JSONRPC +import WalletConnectUtils + +class PendingRequestsProvider { + private let rpcHistory: RPCHistory + + init(rpcHistory: RPCHistory) { + self.rpcHistory = rpcHistory + } + + public func getPendingRequests(account: Account) throws -> [AuthRequest] { + let pendingRequests: [AuthRequest] = rpcHistory.getPending() + .filter {$0.request.method == "wc_authRequest"} + .compactMap { + guard let params = try? $0.request.params?.get(AuthRequestParams.self) else {return nil} + let message = SIWEMessageFormatter().formatMessage(from: params.payloadParams, address: account.address) + return AuthRequest(id: $0.request.id!, message: message) + } + return pendingRequests + } +} From 0913eff4cc1e948c1a22b06c4adf142951cc1b5e Mon Sep 17 00:00:00 2001 From: Bartosz Rozwarski Date: Thu, 11 Aug 2022 09:02:18 +0200 Subject: [PATCH 10/10] remove do catch block --- .../Auth/Services/Wallet/WalletRequestSubscriber.swift | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift b/Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift index fb5510d1f..54819c1da 100644 --- a/Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift +++ b/Sources/Auth/Services/Wallet/WalletRequestSubscriber.swift @@ -29,13 +29,9 @@ class WalletRequestSubscriber { logger.debug("Malformed auth request params") return } - do { - let message = try messageFormatter.formatMessage(from: authRequestParams.payloadParams, address: address) - guard let requestId = subscriptionPayload.request.id else { return } - onRequest?(requestId, message) - } catch { - logger.debug(error) - } + let message = messageFormatter.formatMessage(from: authRequestParams.payloadParams, address: address) + guard let requestId = subscriptionPayload.request.id else { return } + onRequest?(requestId, message) }.store(in: &publishers) }