@@ -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