Skip to content

Commit 46147e4

Browse files
authored
Merge pull request #207 from reown-com/develop
1.7.5
2 parents c419a35 + bdfedcb commit 46147e4

File tree

8 files changed

+123
-31
lines changed

8 files changed

+123
-31
lines changed

Example/ExampleApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/WalletConnectNetworking/NetworkInteracting.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public protocol NetworkInteracting {
1818
func handleHistoryRequest(topic: String, request: RPCRequest)
1919
func trackTopics(_ topics: [String])
2020
func proposeSession(_ request: RPCRequest, topic: String) async throws
21-
func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: RPCResponse, sessionSettleRequest: RPCRequest, approvedChains: [String]) async throws
21+
func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: RPCResponse, sessionSettleRequest: RPCRequest, approvedChains: [String], approvedMethods: [String], approvedEvents: [String]) async throws
2222

2323
func requestSubscription<Request: Codable>(
2424
on request: ProtocolMethod

Sources/WalletConnectNetworking/NetworkingInteractor.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,15 @@ public class NetworkingInteractor: NetworkInteracting {
251251
try await relayClient.proposeSession(pairingTopic: topic, sessionProposal: message, correlationId: correlationId)
252252
}
253253

254-
public func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: RPCResponse, sessionSettleRequest: RPCRequest, approvedChains: [String]) async throws {
254+
public func approveSession(
255+
pairingTopic: String,
256+
sessionTopic: String,
257+
sessionProposalResponse: RPCResponse,
258+
sessionSettleRequest: RPCRequest,
259+
approvedChains: [String],
260+
approvedMethods: [String],
261+
approvedEvents: [String]
262+
) async throws {
255263

256264
let correlationId = sessionProposalResponse.id
257265

@@ -262,7 +270,16 @@ public class NetworkingInteractor: NetworkInteracting {
262270

263271
let serialisedSessionSettlementRequest = try serializer.serialize(topic: sessionTopic, encodable: sessionSettleRequest, envelopeType: .type0)
264272

265-
try await relayClient.approveSession(pairingTopic: pairingTopic, sessionTopic: sessionTopic, sessionProposalResponse: serialisedSessionProposalResponse, sessionSettlementRequest: serialisedSessionSettlementRequest, correlationId: correlationId, approvedChains: approvedChains)
273+
try await relayClient.approveSession(
274+
pairingTopic: pairingTopic,
275+
sessionTopic: sessionTopic,
276+
sessionProposalResponse: serialisedSessionProposalResponse,
277+
sessionSettlementRequest: serialisedSessionSettlementRequest,
278+
correlationId: correlationId,
279+
approvedChains: approvedChains,
280+
approvedMethods: approvedMethods,
281+
approvedEvents: approvedEvents
282+
)
266283

267284
try rpcHistory.resolve(sessionProposalResponse)
268285

Sources/WalletConnectRelay/RPC/Methods/ApproveSession.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ public struct ApproveSession: RelayRPC {
88
let sessionSettlementRequest: String
99
let correlationId: RPCID?
1010
let approvedChains: [String]
11+
let approvedMethods: [String]
12+
let approvedEvents: [String]
1113

12-
init(pairingTopic: String, sessionTopic: String, sessionProposalResponse: String, sessionSettlementRequest: String, correlationId: RPCID?, approvedChains: [String]) {
14+
init(pairingTopic: String, sessionTopic: String, sessionProposalResponse: String, sessionSettlementRequest: String, correlationId: RPCID?, approvedChains: [String], approvedMethods: [String], approvedEvents: [String]) {
1315
self.pairingTopic = pairingTopic
1416
self.sessionTopic = sessionTopic
1517
self.sessionProposalResponse = sessionProposalResponse
1618
self.sessionSettlementRequest = sessionSettlementRequest
1719
self.correlationId = correlationId
1820
self.approvedChains = approvedChains
21+
self.approvedMethods = approvedMethods
22+
self.approvedEvents = approvedEvents
1923
}
2024
}
2125

Sources/WalletConnectRelay/RelayClient.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,18 @@ public final class RelayClient {
167167
subscriptionsTracker.setSubscription(for: pairingTopic, id: UUID().uuidString)
168168
}
169169

170-
public func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: String, sessionSettlementRequest: String, correlationId: RPCID?, approvedChains: [String]) async throws {
171-
let request = ApproveSession(params: .init(pairingTopic: pairingTopic, sessionTopic: sessionTopic, sessionProposalResponse: sessionProposalResponse, sessionSettlementRequest: sessionSettlementRequest, correlationId: correlationId, approvedChains: approvedChains)).asRPCRequest()
170+
public func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: String, sessionSettlementRequest: String, correlationId: RPCID?, approvedChains: [String], approvedMethods: [String], approvedEvents: [String]) async throws {
171+
let params = ApproveSession.Params(
172+
pairingTopic: pairingTopic,
173+
sessionTopic: sessionTopic,
174+
sessionProposalResponse: sessionProposalResponse,
175+
sessionSettlementRequest: sessionSettlementRequest,
176+
correlationId: correlationId,
177+
approvedChains: approvedChains,
178+
approvedMethods: approvedMethods,
179+
approvedEvents: approvedEvents
180+
)
181+
let request = ApproveSession(params: params).asRPCRequest()
172182
let message = try request.asJSONEncodedString()
173183
try await dispatcher.protectedSend(message, connectUnconditionally: true)
174184
topicsTracker.addTopics([sessionTopic])

Sources/WalletConnectSign/Engine/Common/ApproveEngine.swift

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,20 @@ final class ApproveEngine {
144144

145145
let settleRequest = RPCRequest(method: SessionSettleProtocolMethod().method, params: settleParams)
146146

147-
let approvedChains = ApprovedChainsBuilder.build(from: settleParams.namespaces)
147+
let approvedChains = ApprovedSessionMetadataBuilder.chains(from: settleParams.namespaces)
148+
let approvedMethods = ApprovedSessionMetadataBuilder.methods(from: settleParams.namespaces)
149+
let approvedEvents = ApprovedSessionMetadataBuilder.events(from: settleParams.namespaces)
148150

149151
do {
150-
try await networkingInteractor.approveSession(pairingTopic: pairingTopic, sessionTopic: sessionTopic, sessionProposalResponse: response, sessionSettleRequest: settleRequest, approvedChains: approvedChains)
152+
try await networkingInteractor.approveSession(
153+
pairingTopic: pairingTopic,
154+
sessionTopic: sessionTopic,
155+
sessionProposalResponse: response,
156+
sessionSettleRequest: settleRequest,
157+
approvedChains: approvedChains,
158+
approvedMethods: approvedMethods,
159+
approvedEvents: approvedEvents
160+
)
151161
} catch {
152162
eventsClient.saveTraceEvent(ApproveSessionTraceErrorEvents.approveSessionFailure)
153163
throw error
@@ -488,30 +498,36 @@ private extension ApproveEngine {
488498
}
489499
}
490500

491-
enum ApprovedChainsBuilder {
492-
static func build(from namespaces: [String: SessionNamespace]) -> [String] {
493-
var seenChains = Set<String>()
494-
var orderedChains: [String] = []
495-
501+
enum ApprovedSessionMetadataBuilder {
502+
static func chains(from namespaces: [String: SessionNamespace]) -> [String] {
503+
var chains = Set<String>()
496504
namespaces.values.forEach { namespace in
497505
if let namespaceChains = namespace.chains, !namespaceChains.isEmpty {
498506
namespaceChains.forEach { chain in
499-
let absolute = chain.absoluteString
500-
if seenChains.insert(absolute).inserted {
501-
orderedChains.append(absolute)
502-
}
507+
chains.insert(chain.absoluteString)
503508
}
504509
} else {
505510
namespace.accounts.forEach { account in
506-
let absolute = account.blockchain.absoluteString
507-
if seenChains.insert(absolute).inserted {
508-
orderedChains.append(absolute)
509-
}
511+
chains.insert(account.blockchain.absoluteString)
510512
}
511513
}
512514
}
513515

514-
return orderedChains
516+
return chains.sorted()
517+
}
518+
519+
static func methods(from namespaces: [String: SessionNamespace]) -> [String] {
520+
let methods = namespaces.values.reduce(into: Set<String>()) { result, namespace in
521+
result.formUnion(namespace.methods)
522+
}
523+
return methods.sorted()
524+
}
525+
526+
static func events(from namespaces: [String: SessionNamespace]) -> [String] {
527+
let events = namespaces.values.reduce(into: Set<String>()) { result, namespace in
528+
result.formUnion(namespace.events)
529+
}
530+
return events.sorted()
515531
}
516532
}
517533

Tests/TestingUtils/NetworkingInteractorMock.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ public class NetworkingInteractorMock: NetworkInteracting {
1010
subscriptions.append(topic)
1111
}
1212

13-
public func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: JSONRPC.RPCResponse, sessionSettleRequest: JSONRPC.RPCRequest, approvedChains: [String]) async throws {
13+
public func approveSession(pairingTopic: String, sessionTopic: String, sessionProposalResponse: JSONRPC.RPCResponse, sessionSettleRequest: JSONRPC.RPCRequest, approvedChains: [String], approvedMethods: [String], approvedEvents: [String]) async throws {
14+
_ = (approvedChains, approvedMethods, approvedEvents)
1415
subscriptions.append(sessionTopic)
1516
}
1617

Tests/WalletConnectSignTests/ApproveEngineTests.swift

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ final class ApproveEngineTests: XCTestCase {
147147
XCTAssertFalse(cryptoMock.hasPrivateKey(for: session.self.publicKey!), "Responder must remove private key")
148148
}
149149

150-
func testApprovedChainsBuilderUsesExplicitChains() {
150+
func testApprovedSessionBuilderUsesExplicitChains() {
151151
let ethMainnet = Blockchain("eip155:1")!
152152
let polygon = Blockchain("eip155:137")!
153153

@@ -161,12 +161,12 @@ final class ApproveEngineTests: XCTestCase {
161161
events: []
162162
)
163163

164-
let approved = ApprovedChainsBuilder.build(from: ["eip155": namespace])
164+
let approved = ApprovedSessionMetadataBuilder.chains(from: ["eip155": namespace])
165165

166166
XCTAssertEqual(approved, ["eip155:1", "eip155:137"])
167167
}
168168

169-
func testApprovedChainsBuilderFallsBackToAccounts() {
169+
func testApprovedSessionBuilderFallsBackToAccounts() {
170170
let tonMainnetAccount = Account("ton:-239:UQCjI2QtnNXkYxNovk87FQF0J")!
171171
let tonTestAccount = Account("ton:-3:UQCjI2QtnNXkYxNovk87FQF0J")!
172172

@@ -177,12 +177,12 @@ final class ApproveEngineTests: XCTestCase {
177177
events: []
178178
)
179179

180-
let approved = ApprovedChainsBuilder.build(from: ["ton": namespace])
180+
let approved = ApprovedSessionMetadataBuilder.chains(from: ["ton": namespace])
181181

182182
XCTAssertEqual(approved, ["ton:-239", "ton:-3"])
183183
}
184184

185-
func testApprovedChainsBuilderDeduplicatesChains() {
185+
func testApprovedSessionBuilderDeduplicatesChains() {
186186
let ethMainnet = Blockchain("eip155:1")!
187187
let namespaceWithChains = SessionNamespace(
188188
chains: [ethMainnet],
@@ -197,13 +197,57 @@ final class ApproveEngineTests: XCTestCase {
197197
events: []
198198
)
199199

200-
let approved = ApprovedChainsBuilder.build(from: [
200+
let approved = ApprovedSessionMetadataBuilder.chains(from: [
201201
"eip155": namespaceWithChains,
202202
"eip155:1": namespaceWithAccountsOnly
203203
])
204204

205205
XCTAssertEqual(approved, ["eip155:1"])
206206
}
207+
208+
func testApprovedSessionBuilderAggregatesMethods() {
209+
let namespaceA = SessionNamespace(
210+
chains: nil,
211+
accounts: [Account("eip155:1:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb")!],
212+
methods: ["eth_sign", "eth_sendTransaction"],
213+
events: []
214+
)
215+
let namespaceB = SessionNamespace(
216+
chains: nil,
217+
accounts: [Account("eip155:137:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd")!],
218+
methods: ["eth_sendTransaction", "personal_sign"],
219+
events: []
220+
)
221+
222+
let approvedMethods = ApprovedSessionMetadataBuilder.methods(from: [
223+
"eip155": namespaceA,
224+
"eip155:137": namespaceB
225+
])
226+
227+
XCTAssertEqual(approvedMethods, ["eth_sendTransaction", "eth_sign", "personal_sign"])
228+
}
229+
230+
func testApprovedSessionBuilderAggregatesEvents() {
231+
let namespaceA = SessionNamespace(
232+
chains: nil,
233+
accounts: [Account("eip155:1:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb")!],
234+
methods: [],
235+
events: ["accountsChanged", "chainChanged"]
236+
)
237+
let namespaceB = SessionNamespace(
238+
chains: nil,
239+
accounts: [Account("eip155:137:0xabcdefabcdefabcdefabcdefabcdefabcdefabcd")!],
240+
methods: [],
241+
events: ["accountsChanged", "message"]
242+
)
243+
244+
let approvedEvents = ApprovedSessionMetadataBuilder.events(from: [
245+
"eip155": namespaceA,
246+
"eip155:137": namespaceB
247+
])
248+
249+
XCTAssertEqual(approvedEvents, ["accountsChanged", "chainChanged", "message"])
250+
}
207251

208252
func testVerifyContextStorageAdd() {
209253
let proposalReceivedExpectation = expectation(description: "Wallet expects to receive a proposal")

0 commit comments

Comments
 (0)