Skip to content

Commit 8ba8810

Browse files
authored
[ADD] ENS resolvers: Cache resolvers by address to avoid repeating 'supportsInterface' calls (#213)
1 parent 7ac7fe4 commit 8ba8810

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

web3swift/src/ENS/EthereumNameService.swift

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ public class EthereumNameService: EthereumNameServiceProtocol {
5050
let client: EthereumClientProtocol
5151
let registryAddress: EthereumAddress?
5252
let maximumRedirections: Int
53+
private let syncQueue = DispatchQueue(label: "web3swift.ethereumNameService.syncQueue")
54+
55+
private var _resolversByAddress = [EthereumAddress: ENSResolver]()
56+
var resolversByAddress: [EthereumAddress : ENSResolver] {
57+
get {
58+
var byAddress: [EthereumAddress: ENSResolver]!
59+
syncQueue.sync { byAddress = _resolversByAddress }
60+
return byAddress
61+
}
62+
set {
63+
syncQueue.async(flags: .barrier) {
64+
self._resolversByAddress = newValue
65+
}
66+
}
67+
}
5368

5469
required public init(
5570
client: EthereumClientProtocol,
@@ -91,13 +106,14 @@ public class EthereumNameService: EthereumNameServiceProtocol {
91106
return completion(EthereumNameServiceError.noResolver, nil)
92107
}
93108

94-
Task {
95-
let resolver = ENSResolver(
96-
address: resolverAddress,
97-
client: self.client,
98-
callResolution: mode.callResolution(maxRedirects: self.maximumRedirections)
99-
)
109+
let resolver = self.resolversByAddress[resolverAddress] ?? ENSResolver(
110+
address: resolverAddress,
111+
client: self.client,
112+
callResolution: mode.callResolution(maxRedirects: self.maximumRedirections)
113+
)
114+
self.resolversByAddress[resolverAddress] = resolver
100115

116+
Task {
101117
do {
102118
let name = try await resolver.resolve(address: address)
103119
completion(nil, name)
@@ -137,12 +153,14 @@ public class EthereumNameService: EthereumNameServiceProtocol {
137153
return completion(EthereumNameServiceError.noResolver, nil)
138154
}
139155

156+
let resolver = self.resolversByAddress[resolverAddress] ?? ENSResolver(
157+
address: resolverAddress,
158+
client: self.client,
159+
callResolution: mode.callResolution(maxRedirects: self.maximumRedirections)
160+
)
161+
self.resolversByAddress[resolverAddress] = resolver
162+
140163
Task {
141-
let resolver = ENSResolver(
142-
address: resolverAddress,
143-
client: self.client,
144-
callResolution: mode.callResolution(maxRedirects: self.maximumRedirections)
145-
)
146164
do {
147165
let address = try await resolver.resolve(name: ens)
148166
completion(nil, address)

0 commit comments

Comments
 (0)