diff --git a/Example/ExampleApp.xcodeproj/IntegrationTests.xctestplan b/Example/ExampleApp.xcodeproj/IntegrationTests.xctestplan index 896a5c3c7..e3aa93b52 100644 --- a/Example/ExampleApp.xcodeproj/IntegrationTests.xctestplan +++ b/Example/ExampleApp.xcodeproj/IntegrationTests.xctestplan @@ -53,6 +53,7 @@ "AuthTests\/testEIP1271RespondSuccess()", "ChatTests", "ENSResolverTests", + "HistoryTests", "SyncDerivationServiceTests", "SyncTests" ], diff --git a/Example/IntegrationTests/Chat/ChatTests.swift b/Example/IntegrationTests/Chat/ChatTests.swift index 0d44be8b6..04cdc7e68 100644 --- a/Example/IntegrationTests/Chat/ChatTests.swift +++ b/Example/IntegrationTests/Chat/ChatTests.swift @@ -74,7 +74,9 @@ final class ChatTests: XCTestCase { let historyClient = HistoryClientFactory.create( historyUrl: "https://history.walletconnect.com", relayUrl: "wss://relay.walletconnect.com", - keychain: keychain + keyValueStorage: keyValueStorage, + keychain: keychain, + logger: logger ) let clientId = try! networkingInteractor.getClientId() diff --git a/Example/IntegrationTests/History/HistoryTests.swift b/Example/IntegrationTests/History/HistoryTests.swift index 40d52f5c0..d96e0f811 100644 --- a/Example/IntegrationTests/History/HistoryTests.swift +++ b/Example/IntegrationTests/History/HistoryTests.swift @@ -18,9 +18,11 @@ final class HistoryTests: XCTestCase { override func setUp() { let keychain1 = KeychainStorageMock() let keychain2 = KeychainStorageMock() + let logger1 = ConsoleLoggerMock() + let defaults1 = RuntimeKeyValueStorage() relayClient1 = makeRelayClient(prefix: "🐄", keychain: keychain1) relayClient2 = makeRelayClient(prefix: "🐫", keychain: keychain2) - historyClient = makeHistoryClient(keychain: keychain1) + historyClient = makeHistoryClient(defaults: defaults1, keychain: keychain1, logger: logger1) } private func makeRelayClient(prefix: String, keychain: KeychainStorageProtocol) -> RelayClient { @@ -33,8 +35,8 @@ final class HistoryTests: XCTestCase { logger: ConsoleLogger(prefix: prefix + " [Relay]", loggingLevel: .debug)) } - private func makeHistoryClient(keychain: KeychainStorageProtocol) -> HistoryNetworkService { - let clientIdStorage = ClientIdStorage(keychain: keychain) + private func makeHistoryClient(defaults: KeyValueStorage, keychain: KeychainStorageProtocol, logger: ConsoleLogging) -> HistoryNetworkService { + let clientIdStorage = ClientIdStorage(defaults: defaults, keychain: keychain, logger: logger) return HistoryNetworkService(clientIdStorage: clientIdStorage) } diff --git a/Example/IntegrationTests/Pairing/PairingTests.swift b/Example/IntegrationTests/Pairing/PairingTests.swift index a2b49e07b..f7ade4b87 100644 --- a/Example/IntegrationTests/Pairing/PairingTests.swift +++ b/Example/IntegrationTests/Pairing/PairingTests.swift @@ -78,11 +78,14 @@ final class PairingTests: XCTestCase { let prefix = "🐶 Wallet: " let (pairingClient, networkingInteractor, keychain, keyValueStorage) = makeClientDependencies(prefix: prefix) let notifyLogger = ConsoleLogger(prefix: prefix + " [Notify]", loggingLevel: .debug) + let defaults = RuntimeKeyValueStorage() walletPairingClient = pairingClient let historyClient = HistoryClientFactory.create( historyUrl: "https://history.walletconnect.com", relayUrl: "wss://relay.walletconnect.com", - keychain: keychain + keyValueStorage: defaults, + keychain: keychain, + logger: notifyLogger ) appAuthClient = AuthClientFactory.create( metadata: AppMetadata(name: name, description: "", url: "", icons: [""]), diff --git a/Example/IntegrationTests/Push/NotifyTests.swift b/Example/IntegrationTests/Push/NotifyTests.swift index 00783bd2a..67f2aa889 100644 --- a/Example/IntegrationTests/Push/NotifyTests.swift +++ b/Example/IntegrationTests/Push/NotifyTests.swift @@ -70,6 +70,7 @@ final class NotifyTests: XCTestCase { let notifyLogger = ConsoleLogger(prefix: prefix + " [Notify]", loggingLevel: .debug) let pushClient = PushClientFactory.create(projectId: "", pushHost: "echo.walletconnect.com", + keyValueStorage: keyValueStorage, keychainStorage: keychain, environment: .sandbox) let keyserverURL = URL(string: "https://keys.walletconnect.com")! diff --git a/Example/RelayIntegrationTests/RelayClientEndToEndTests.swift b/Example/RelayIntegrationTests/RelayClientEndToEndTests.swift index 9dc595c95..e6e5263ae 100644 --- a/Example/RelayIntegrationTests/RelayClientEndToEndTests.swift +++ b/Example/RelayIntegrationTests/RelayClientEndToEndTests.swift @@ -31,7 +31,9 @@ final class RelayClientEndToEndTests: XCTestCase { private var publishers = Set() func makeRelayClient(prefix: String) -> RelayClient { - let clientIdStorage = ClientIdStorage(keychain: KeychainStorageMock()) + let keyValueStorage = RuntimeKeyValueStorage() + let logger = ConsoleLogger(prefix: prefix, loggingLevel: .debug) + let clientIdStorage = ClientIdStorage(defaults: keyValueStorage, keychain: KeychainStorageMock(), logger: logger) let socketAuthenticator = ClientIdAuthenticator( clientIdStorage: clientIdStorage, url: InputConfig.relayUrl @@ -43,7 +45,6 @@ final class RelayClientEndToEndTests: XCTestCase { ) let socket = WebSocket(url: urlFactory.create(fallback: false)) let webSocketFactory = WebSocketFactoryMock(webSocket: socket) - let logger = ConsoleLogger(prefix: prefix, loggingLevel: .debug) let dispatcher = Dispatcher( socketFactory: webSocketFactory, relayUrlFactory: urlFactory, @@ -51,7 +52,6 @@ final class RelayClientEndToEndTests: XCTestCase { logger: logger ) let keychain = KeychainStorageMock() - let keyValueStorage = RuntimeKeyValueStorage() let relayClient = RelayClientFactory.create( relayHost: InputConfig.relayHost, projectId: InputConfig.projectId, diff --git a/Sources/WalletConnectHistory/HistoryClientFactory.swift b/Sources/WalletConnectHistory/HistoryClientFactory.swift index 5168430a3..6ca9b78ab 100644 --- a/Sources/WalletConnectHistory/HistoryClientFactory.swift +++ b/Sources/WalletConnectHistory/HistoryClientFactory.swift @@ -4,15 +4,19 @@ class HistoryClientFactory { static func create() -> HistoryClient { let keychain = KeychainStorage(serviceIdentifier: "com.walletconnect.sdk") + let keyValueStorage = UserDefaults.standard + let logger = ConsoleLogger() return HistoryClientFactory.create( historyUrl: "https://history.walletconnect.com", relayUrl: "wss://relay.walletconnect.com", - keychain: keychain + keyValueStorage: keyValueStorage, + keychain: keychain, + logger: logger ) } - static func create(historyUrl: String, relayUrl: String, keychain: KeychainStorageProtocol) -> HistoryClient { - let clientIdStorage = ClientIdStorage(keychain: keychain) + static func create(historyUrl: String, relayUrl: String, keyValueStorage: KeyValueStorage, keychain: KeychainStorageProtocol, logger: ConsoleLogging) -> HistoryClient { + let clientIdStorage = ClientIdStorage(defaults: keyValueStorage, keychain: keychain, logger: logger) let kms = KeyManagementService(keychain: keychain) let serializer = Serializer(kms: kms, logger: ConsoleLogger(prefix: "🔐", loggingLevel: .off)) let historyNetworkService = HistoryNetworkService(clientIdStorage: clientIdStorage) diff --git a/Sources/WalletConnectJWT/JSONEncoder+JWT.swift b/Sources/WalletConnectJWT/JSONEncoder+JWT.swift new file mode 100644 index 000000000..7f73ad98c --- /dev/null +++ b/Sources/WalletConnectJWT/JSONEncoder+JWT.swift @@ -0,0 +1,11 @@ +import Foundation + +extension JSONEncoder { + + public static var jwt: JSONEncoder { + let jsonEncoder = JSONEncoder() + jsonEncoder.outputFormatting = .withoutEscapingSlashes + jsonEncoder.dateEncodingStrategy = .secondsSince1970 + return jsonEncoder + } +} diff --git a/Sources/WalletConnectJWT/JWT.swift b/Sources/WalletConnectJWT/JWT.swift index 5e3259440..d37728840 100644 --- a/Sources/WalletConnectJWT/JWT.swift +++ b/Sources/WalletConnectJWT/JWT.swift @@ -7,12 +7,12 @@ struct JWT: Codable, Equatable { let signature: String let string: String - init(claims: JWTClaims, signer: JWTSigning) throws { + init(claims: JWTClaims, signer: JWTSigning, jsonEncoder: JSONEncoder = .jwt) throws { self.header = JWTHeader(alg: signer.alg) self.claims = claims - let headerString = try header.encode() - let claimsString = try claims.encode() + let headerString = try header.encode(jsonEncoder: jsonEncoder) + let claimsString = try claims.encode(jsonEncoder: jsonEncoder) let signature = try signer.sign(header: headerString, claims: claimsString) self.signature = signature diff --git a/Sources/WalletConnectJWT/JWTEncodable.swift b/Sources/WalletConnectJWT/JWTEncodable.swift index 04505fdb5..e612e47f8 100644 --- a/Sources/WalletConnectJWT/JWTEncodable.swift +++ b/Sources/WalletConnectJWT/JWTEncodable.swift @@ -1,17 +1,14 @@ import Foundation public protocol JWTEncodable: Codable, Equatable { - func encode() throws -> String + func encode(jsonEncoder: JSONEncoder) throws -> String static func decode(from string: String) throws -> Self } extension JWTEncodable { - public func encode() throws -> String { - let jsonEncoder = JSONEncoder() - jsonEncoder.outputFormatting = .withoutEscapingSlashes - jsonEncoder.dateEncodingStrategy = .secondsSince1970 + public func encode(jsonEncoder: JSONEncoder) throws -> String { let data = try jsonEncoder.encode(self) return JWTEncoder.base64urlEncodedString(data: data) } diff --git a/Sources/WalletConnectPush/PushClientFactory.swift b/Sources/WalletConnectPush/PushClientFactory.swift index 65c733886..fb2fb0d10 100644 --- a/Sources/WalletConnectPush/PushClientFactory.swift +++ b/Sources/WalletConnectPush/PushClientFactory.swift @@ -6,10 +6,12 @@ public struct PushClientFactory { environment: APNSEnvironment) -> PushClient { let keychainStorage = KeychainStorage(serviceIdentifier: "com.walletconnect.sdk") + let keyValueStorage = UserDefaults.standard return PushClientFactory.create( projectId: projectId, pushHost: pushHost, + keyValueStorage: keyValueStorage, keychainStorage: keychainStorage, environment: environment) } @@ -17,6 +19,7 @@ public struct PushClientFactory { public static func create( projectId: String, pushHost: String, + keyValueStorage: KeyValueStorage, keychainStorage: KeychainStorageProtocol, environment: APNSEnvironment ) -> PushClient { @@ -28,7 +31,7 @@ public struct PushClientFactory { let logger = ConsoleLogger(prefix: "👂🏻", loggingLevel: .off) let httpClient = HTTPNetworkClient(host: pushHost, session: session) - let clientIdStorage = ClientIdStorage(keychain: keychainStorage) + let clientIdStorage = ClientIdStorage(defaults: keyValueStorage, keychain: keychainStorage, logger: logger) let pushAuthenticator = PushAuthenticator(clientIdStorage: clientIdStorage, pushHost: pushHost) diff --git a/Sources/WalletConnectRelay/ClientAuth/ClientIdStorage.swift b/Sources/WalletConnectRelay/ClientAuth/ClientIdStorage.swift index 2e3c9cd7f..272451b96 100644 --- a/Sources/WalletConnectRelay/ClientAuth/ClientIdStorage.swift +++ b/Sources/WalletConnectRelay/ClientAuth/ClientIdStorage.swift @@ -6,26 +6,89 @@ public protocol ClientIdStoring { } public struct ClientIdStorage: ClientIdStoring { - private let key = "com.walletconnect.iridium.client_id" + private let oldStorageKey = "com.walletconnect.iridium.client_id" + private let publicStorageKey = "com.walletconnect.iridium.client_id.public" + + private let defaults: KeyValueStorage private let keychain: KeychainStorageProtocol + private let logger: ConsoleLogging - public init(keychain: KeychainStorageProtocol) { + public init(defaults: KeyValueStorage, keychain: KeychainStorageProtocol, logger: ConsoleLogging) { + self.defaults = defaults self.keychain = keychain + self.logger = logger + + migrateIfNeeded() } public func getOrCreateKeyPair() throws -> SigningPrivateKey { do { - return try keychain.read(key: key) + let publicPart = try getPublicPart() + return try getPrivatePart(for: publicPart) } catch { let privateKey = SigningPrivateKey() - try keychain.add(privateKey, forKey: key) + try setPrivatePart(privateKey) + setPublicPart(privateKey.publicKey) return privateKey } } public func getClientId() throws -> String { - let privateKey: SigningPrivateKey = try keychain.read(key: key) - let pubKey = privateKey.publicKey.rawRepresentation - return DIDKey(rawData: pubKey).did(variant: .ED25519) + let pubKey = try getPublicPart() + let _ = try getPrivatePart(for: pubKey) + return DIDKey(rawData: pubKey.rawRepresentation).did(variant: .ED25519) + } +} + +private extension ClientIdStorage { + + enum Errors: Error { + case publicPartNotFound + case privatePartNotFound + } + + func migrateIfNeeded() { + guard let privateKey: SigningPrivateKey = try? keychain.read(key: oldStorageKey) else { + return + } + + do { + try setPrivatePart(privateKey) + setPublicPart(privateKey.publicKey) + try keychain.delete(key: oldStorageKey) + logger.debug("ClientID migrated") + } catch { + logger.debug("ClientID migration failed with: \(error.localizedDescription)") + } + } + + func getPublicPart() throws -> SigningPublicKey { + guard let data = defaults.data(forKey: publicStorageKey) else { + throw Errors.publicPartNotFound + } + return try SigningPublicKey(rawRepresentation: data) + } + + func setPublicPart(_ newValue: SigningPublicKey) { + defaults.set(newValue.rawRepresentation, forKey: publicStorageKey) + } + + func getPrivatePart(for publicPart: SigningPublicKey) throws -> SigningPrivateKey { + do { + return try keychain.read(key: publicPart.storageId) + } catch { + throw Errors.privatePartNotFound + } + } + + func setPrivatePart(_ newValue: SigningPrivateKey) throws { + try keychain.add(newValue, forKey: newValue.publicKey.storageId) + } +} + +private extension SigningPublicKey { + + var storageId: String { + return rawRepresentation.sha256().toHexString() } } diff --git a/Sources/WalletConnectRelay/RelayClientFactory.swift b/Sources/WalletConnectRelay/RelayClientFactory.swift index 6748811fb..48e7f766a 100644 --- a/Sources/WalletConnectRelay/RelayClientFactory.swift +++ b/Sources/WalletConnectRelay/RelayClientFactory.swift @@ -39,7 +39,7 @@ public struct RelayClientFactory { logger: ConsoleLogging ) -> RelayClient { - let clientIdStorage = ClientIdStorage(keychain: keychainStorage) + let clientIdStorage = ClientIdStorage(defaults: keyValueStorage, keychain: keychainStorage, logger: logger) let socketAuthenticator = ClientIdAuthenticator( clientIdStorage: clientIdStorage, diff --git a/Tests/CommonsTests/AnyCodableTests.swift b/Tests/CommonsTests/AnyCodableTests.swift index bce2de631..9fe96b88d 100644 --- a/Tests/CommonsTests/AnyCodableTests.swift +++ b/Tests/CommonsTests/AnyCodableTests.swift @@ -28,7 +28,7 @@ private struct SampleStruct: Codable, Equatable { SampleStruct( bool: true, int: 1337, - double: 13.37, + double: 13, string: "verystringwow", object: SubObject( string: "0xdeadbeef" @@ -40,7 +40,7 @@ private struct SampleStruct: Codable, Equatable { { "bool": true, "int": 1337, - "double": 13.37, + "double": 13, "string": "verystringwow", "object": { "string": "0xdeadbeef" @@ -52,7 +52,7 @@ private struct SampleStruct: Codable, Equatable { { "bool": ****, "int": 1337, - "double": 13.37, + "double": 13, "string": "verystringwow", } """.data(using: .utf8)! diff --git a/Tests/RelayerTests/AuthTests/ClientIdStorageTests.swift b/Tests/RelayerTests/AuthTests/ClientIdStorageTests.swift index 05532fa8d..45b147637 100644 --- a/Tests/RelayerTests/AuthTests/ClientIdStorageTests.swift +++ b/Tests/RelayerTests/AuthTests/ClientIdStorageTests.swift @@ -8,17 +8,20 @@ final class ClientIdStorageTests: XCTestCase { var sut: ClientIdStorage! var keychain: KeychainStorageMock! + var defaults: RuntimeKeyValueStorage! override func setUp() { keychain = KeychainStorageMock() - sut = ClientIdStorage(keychain: keychain) + defaults = RuntimeKeyValueStorage() + sut = ClientIdStorage(defaults: defaults, keychain: keychain, logger: ConsoleLoggerMock()) } func testGetOrCreate() throws { XCTAssertThrowsError(try keychain.read(key: "com.walletconnect.iridium.client_id") as SigningPrivateKey) let saved = try sut.getOrCreateKeyPair() - XCTAssertEqual(saved, try keychain.read(key: "com.walletconnect.iridium.client_id")) + let storageId = saved.publicKey.rawRepresentation.sha256().toHexString() + XCTAssertEqual(saved, try keychain.read(key: storageId)) let restored = try sut.getOrCreateKeyPair() XCTAssertEqual(saved, restored) @@ -27,11 +30,51 @@ final class ClientIdStorageTests: XCTestCase { func testGetClientId() throws { let didKey = try DIDKey(did: "did:key:z6MkodHZwneVRShtaLf8JKYkxpDGp1vGZnpGmdBpX8M2exxH") + /// Initial state + XCTAssertThrowsError(try sut.getClientId()) + let privateKey = try SigningPrivateKey(rawRepresentation: didKey.rawData) - try keychain.add(privateKey, forKey: "com.walletconnect.iridium.client_id") + + defaults.set(privateKey.publicKey.rawRepresentation, forKey: "com.walletconnect.iridium.client_id.public") + + /// Private part not found + XCTAssertThrowsError(try sut.getClientId()) + + let storageId = privateKey.publicKey.rawRepresentation.sha256().toHexString() + try keychain.add(privateKey, forKey: storageId) let clientId = try sut.getClientId() let didPublicKey = DIDKey(rawData: privateKey.publicKey.rawRepresentation) + XCTAssertEqual(clientId, didPublicKey.did(variant: .ED25519)) } + + func testMigration() throws { + let defaults = RuntimeKeyValueStorage() + let keychain = KeychainStorageMock() + let clientId = SigningPrivateKey() + + try keychain.add(clientId, forKey: "com.walletconnect.iridium.client_id") + + // Migration on init + let clientIdStorage = ClientIdStorage(defaults: defaults, keychain: keychain, logger: ConsoleLoggerMock()) + + let publicPartData = defaults.data(forKey: "com.walletconnect.iridium.client_id.public")! + let publicPart = try SigningPublicKey(rawRepresentation: publicPartData) + + let privatePartStorageId = publicPart.rawRepresentation.sha256().toHexString() + let privatePart: SigningPrivateKey = try keychain.read(key: privatePartStorageId) + + XCTAssertEqual(publicPart, clientId.publicKey) + XCTAssertEqual(privatePart, clientId) + + let oldClientId: SigningPrivateKey? = try? keychain.read(key: "com.walletconnect.iridium.client_id") + XCTAssertNil(oldClientId) + + let restoredPrivatePart = try clientIdStorage.getOrCreateKeyPair() + XCTAssertEqual(restoredPrivatePart, clientId) + + let restoredPublicPart = try clientIdStorage.getClientId() + XCTAssertEqual(restoredPublicPart, DIDKey(rawData: clientId.publicKey.rawRepresentation).did(variant: .ED25519)) + } } diff --git a/Tests/RelayerTests/AuthTests/EdDSASignerTests.swift b/Tests/RelayerTests/AuthTests/EdDSASignerTests.swift index 87d5ae4c3..cbd8d2878 100644 --- a/Tests/RelayerTests/AuthTests/EdDSASignerTests.swift +++ b/Tests/RelayerTests/AuthTests/EdDSASignerTests.swift @@ -11,8 +11,8 @@ final class EdDSASignerTests: XCTestCase { let keyRaw = Data(hex: "58e0254c211b858ef7896b00e3f36beeb13d568d47c6031c4218b87718061295") let signingKey = try! SigningPrivateKey(rawRepresentation: keyRaw) sut = EdDSASigner(signingKey) - let header = try! JWTHeader(alg: "EdDSA").encode() - let claims = try! RelayAuthPayload.Claims.stub().encode() + let header = try! JWTHeader(alg: "EdDSA").encode(jsonEncoder: .jwt) + let claims = try! RelayAuthPayload.Claims.stub().encode(jsonEncoder: .jwt) let signature = try! sut.sign(header: header, claims: claims) XCTAssertNotNil(signature) } diff --git a/Tests/RelayerTests/AuthTests/JWTTests.swift b/Tests/RelayerTests/AuthTests/JWTTests.swift index 1d07ff0c7..9e662ff72 100644 --- a/Tests/RelayerTests/AuthTests/JWTTests.swift +++ b/Tests/RelayerTests/AuthTests/JWTTests.swift @@ -4,12 +4,15 @@ import XCTest @testable import WalletConnectJWT final class JWTTests: XCTestCase { - let expectedJWT = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2NTY5MTAwOTcsImV4cCI6MTY1Njk5NjQ5NywiaXNzIjoiZGlkOmtleTp6Nk1rb2RIWnduZVZSU2h0YUxmOEpLWWt4cERHcDF2R1pucEdtZEJwWDhNMmV4eEgiLCJzdWIiOiJjNDc5ZmU1ZGM0NjRlNzcxZTc4YjE5M2QyMzlhNjViNThkMjc4Y2FkMWMzNGJmYjBiNTcxNmU1YmI1MTQ5MjhlIiwiYXVkIjoid3NzOi8vcmVsYXkud2FsbGV0Y29ubmVjdC5jb20ifQ.0JkxOM-FV21U7Hk-xycargj_qNRaYV2H5HYtE4GzAeVQYiKWj7YySY5AdSqtCgGzX4Gt98XWXn2kSr9rE1qvCA" + let expectedJWT = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ3c3M6Ly9yZWxheS53YWxsZXRjb25uZWN0LmNvbSIsImV4cCI6MTY1Njk5NjQ5NywiaWF0IjoxNjU2OTEwMDk3LCJpc3MiOiJkaWQ6a2V5Ono2TWtvZEhad25lVlJTaHRhTGY4SktZa3hwREdwMXZHWm5wR21kQnBYOE0yZXh4SCIsInN1YiI6ImM0NzlmZTVkYzQ2NGU3NzFlNzhiMTkzZDIzOWE2NWI1OGQyNzhjYWQxYzM0YmZiMGI1NzE2ZTViYjUxNDkyOGUifQ.0JkxOM-FV21U7Hk-xycargj_qNRaYV2H5HYtE4GzAeVQYiKWj7YySY5AdSqtCgGzX4Gt98XWXn2kSr9rE1qvCA" func testJWTEncoding() throws { let signer = EdDSASignerMock() signer.signature = "0JkxOM-FV21U7Hk-xycargj_qNRaYV2H5HYtE4GzAeVQYiKWj7YySY5AdSqtCgGzX4Gt98XWXn2kSr9rE1qvCA" - let jwt = try JWT(claims: RelayAuthPayload.Claims.stub(), signer: signer) + let jsonEncoder = JSONEncoder() + jsonEncoder.outputFormatting = [.sortedKeys, .withoutEscapingSlashes] + jsonEncoder.dateEncodingStrategy = .secondsSince1970 + let jwt = try JWT(claims: RelayAuthPayload.Claims.stub(), signer: signer, jsonEncoder: jsonEncoder) XCTAssertEqual(expectedJWT, jwt.string) } diff --git a/Tests/RelayerTests/DispatcherTests.swift b/Tests/RelayerTests/DispatcherTests.swift index 35660c6f1..4ab1c0a48 100644 --- a/Tests/RelayerTests/DispatcherTests.swift +++ b/Tests/RelayerTests/DispatcherTests.swift @@ -60,8 +60,10 @@ final class DispatcherTests: XCTestCase { webSocket = WebSocketMock() let webSocketFactory = WebSocketFactoryMock(webSocket: webSocket) networkMonitor = NetworkMonitoringMock() + let defaults = RuntimeKeyValueStorage() + let logger = ConsoleLoggerMock() let keychainStorageMock = DispatcherKeychainStorageMock() - let clientIdStorage = ClientIdStorage(keychain: keychainStorageMock) + let clientIdStorage = ClientIdStorage(defaults: defaults, keychain: keychainStorageMock, logger: logger) let socketAuthenticator = ClientIdAuthenticator( clientIdStorage: clientIdStorage, url: "wss://relay.walletconnect.com"