Skip to content

Commit 0399a53

Browse files
authored
fix: handling rn sdk read-only calls (#187)
* fix: handling rn sdk read-only calls * update read only provider
1 parent 1d440a2 commit 0399a53

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ Alternatively, you can add the URL directly in your project's package file:
5454
dependencies: [
5555
.package(
5656
url: "https://github.com/MetaMask/metamask-ios-sdk",
57-
from: "0.8.6"
57+
from: "0.8.7"
5858
)
5959
]
6060
```

Sources/metamask-ios-sdk/Classes/API/InfuraProvider.swift

+22-9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class ReadOnlyRPCProvider {
99
let infuraAPIKey: String
1010
private let network: any Networking
1111

12+
let rpcUrls: [String: String]
1213
let readonlyRPCMap: [String: String]
1314

1415
public convenience init(infuraAPIKey: String? = nil, readonlyRPCMap: [String: String]? = nil) {
@@ -18,26 +19,31 @@ public class ReadOnlyRPCProvider {
1819
init(infuraAPIKey: String? = nil, readonlyRPCMap: [String: String]?, network: any Networking) {
1920
self.infuraAPIKey = infuraAPIKey ?? ""
2021
self.network = network
22+
self.readonlyRPCMap = readonlyRPCMap ?? [:]
2123

2224
if let providedRPCMap = readonlyRPCMap {
2325
if let apiKey = infuraAPIKey {
2426
// Merge infuraReadonlyRPCMap with readonlyRPCMap, overriding infura's keys if they are present in readonlyRPCMap
2527
var mergedMap = ReadOnlyRPCProvider.infuraReadonlyRPCMap(apiKey)
2628
providedRPCMap.forEach { mergedMap[$0.key] = $0.value }
27-
self.readonlyRPCMap = mergedMap
29+
self.rpcUrls = mergedMap
2830
} else {
2931
// Use only the provided readonlyRPCMap
30-
self.readonlyRPCMap = providedRPCMap
32+
self.rpcUrls = providedRPCMap
3133
}
3234
} else if let apiKey = infuraAPIKey {
3335
// Use infuraReadonlyRPCMap as default
34-
self.readonlyRPCMap = ReadOnlyRPCProvider.infuraReadonlyRPCMap(apiKey)
36+
self.rpcUrls = ReadOnlyRPCProvider.infuraReadonlyRPCMap(apiKey)
3537
} else {
3638
// Default to an empty map if neither are provided
37-
self.readonlyRPCMap = [:]
39+
self.rpcUrls = [:]
3840
}
3941
}
4042

43+
func supportsChain(_ chainId: String) -> Bool {
44+
return rpcUrls[chainId] != nil && (readonlyRPCMap[chainId] != nil || !infuraAPIKey.isEmpty)
45+
}
46+
4147
static func infuraReadonlyRPCMap(_ infuraAPIKey: String) -> [String: String] {
4248
[
4349
// ###### Ethereum ######
@@ -96,17 +102,20 @@ public class ReadOnlyRPCProvider {
96102
}
97103

98104
func endpoint(for chainId: String) -> String? {
99-
readonlyRPCMap[chainId]
105+
rpcUrls[chainId]
100106
}
101107

102-
public func sendRequest(_ request: any RPCRequest, chainId: String, appMetadata: AppMetadata) async -> Any? {
108+
public func sendRequest(_ request: any RPCRequest,
109+
params: Any = "",
110+
chainId: String,
111+
appMetadata: AppMetadata) async -> Any? {
103112
Logging.log("ReadOnlyRPCProvider:: Sending request \(request.method) on chain \(chainId) via Infura API")
104113

105114
let params: [String: Any] = [
106115
"method": request.method,
107116
"jsonrpc": "2.0",
108117
"id": request.id,
109-
"params": request.params
118+
"params": params
110119
]
111120

112121
guard let endpoint = endpoint(for: chainId) else {
@@ -132,10 +141,14 @@ public class ReadOnlyRPCProvider {
132141
}
133142

134143
Logging.error("ReadOnlyRPCProvider:: could not get result from response \(json)")
144+
if let error = json["error"] as? [String: Any] {
145+
return RequestError(from: error)
146+
}
147+
135148
return nil
136149
} catch {
137-
Logging.error("tracking error: \(error.localizedDescription)")
138-
return nil
150+
Logging.error("ReadOnlyRPCProvider:: error: \(error.localizedDescription)")
151+
return RequestError(from: ["code": -1, "message": error.localizedDescription])
139152
}
140153
}
141154
}

Sources/metamask-ios-sdk/Classes/Ethereum/Ethereum.swift

+15-6
Original file line numberDiff line numberDiff line change
@@ -431,20 +431,29 @@ public class Ethereum {
431431
submittedRequests.removeAll()
432432
clearSession()
433433
}
434-
435-
func useReadOnlyRPCProvider() -> Bool {
436-
!readOnlyRPCProvider.infuraAPIKey.isEmpty || !readOnlyRPCProvider.readonlyRPCMap.isEmpty
437-
}
438434

439435
// MARK: Request Sending
440436

441437
func sendRequest(_ request: any RPCRequest) {
442438
if
443439
EthereumMethod.isReadOnly(request.methodType),
444-
useReadOnlyRPCProvider() {
440+
readOnlyRPCProvider.supportsChain(chainId) {
445441
Task {
442+
let readOnlyRequest = EthereumRequest(
443+
id: request.id,
444+
method: request.method
445+
)
446+
var params: Any = request.params
447+
448+
if
449+
let paramsData = request.params as? Data,
450+
let json = try? JSONSerialization.jsonObject(with: paramsData, options: []) {
451+
params = json
452+
}
453+
446454
if let result = await readOnlyRPCProvider.sendRequest(
447-
request,
455+
readOnlyRequest,
456+
params: params,
448457
chainId: chainId,
449458
appMetadata: commClient.appMetadata ?? AppMetadata(name: "", url: "")) {
450459
sendResult(result, id: request.id)

metamask-ios-sdk.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'metamask-ios-sdk'
3-
s.version = '0.8.6'
3+
s.version = '0.8.7'
44
s.summary = 'Enable users to easily connect with their MetaMask Mobile wallet.'
55
s.swift_version = '5.5'
66

0 commit comments

Comments
 (0)