@@ -87,23 +87,23 @@ extension web3.web3contract {
87
87
- important: This call is synchronous
88
88
89
89
*/
90
- public func parseTransaction( _ transaction: EthereumTransaction ) throws -> [ EventParserResultProtocol ] {
91
- let result = try self . parseTransactionPromise ( transaction)
90
+ public func parseTransaction( _ transaction: EthereumTransaction ) async throws -> [ EventParserResultProtocol ] {
91
+ let result = try await self . parseTransactionPromise ( transaction)
92
92
return result
93
93
}
94
94
}
95
95
}
96
96
97
97
extension web3 . web3contract . EventParser {
98
- public func parseTransactionPromise( _ transaction: EthereumTransaction ) throws -> [ EventParserResultProtocol ] {
98
+ public func parseTransactionPromise( _ transaction: EthereumTransaction ) async throws -> [ EventParserResultProtocol ] {
99
99
guard let hash = transaction. hash else {
100
100
throw Web3Error . processingError ( desc: " Failed to get transaction hash " )
101
101
}
102
- return try self . parseTransactionByHashPromise ( hash)
102
+ return try await self . parseTransactionByHashPromise ( hash)
103
103
}
104
104
105
- public func parseTransactionByHashPromise( _ hash: Data ) throws -> [ EventParserResultProtocol ] {
106
- let receipt = self . web3. eth. getTransactionReceiptPromise ( hash)
105
+ public func parseTransactionByHashPromise( _ hash: Data ) async throws -> [ EventParserResultProtocol ] {
106
+ let receipt = try await self . web3. eth. getTransactionReceiptPromise ( hash)
107
107
108
108
guard let results = parseReceiptForLogs ( receipt: receipt, contract: contract, eventName: eventName, filter: filter) else {
109
109
throw Web3Error . processingError ( desc: " Failed to parse receipt for events " )
@@ -143,42 +143,40 @@ extension web3.web3contract.EventParser {
143
143
}
144
144
145
145
146
- return Promise { seal in
147
-
148
- var pendingEvents : [ Promise < [ EventParserResultProtocol ] > ] = [ Promise < [ EventParserResultProtocol ] > ] ( )
149
- for transaction in block. transactions {
150
- switch transaction {
151
- case . null:
152
- seal. reject ( Web3Error . processingError ( desc: " No information about transactions in block " ) )
153
- return
154
- case . transaction( let tx) :
155
- guard let hash = tx. hash else {
156
- seal. reject ( Web3Error . processingError ( desc: " Failed to get transaction hash " ) )
157
- return
158
- }
159
- let subresultPromise = self . parseTransactionByHashPromise ( hash)
160
- pendingEvents. append ( subresultPromise)
161
- case . hash( let hash) :
162
- let subresultPromise = self . parseTransactionByHashPromise ( hash)
163
- pendingEvents. append ( subresultPromise)
146
+
147
+
148
+ var pendingEvents : [ [ EventParserResultProtocol ] ] = [ [ EventParserResultProtocol] ] ( )
149
+ for transaction in block. transactions {
150
+ switch transaction {
151
+ case . null:
152
+ throw Web3Error . processingError ( desc: " No information about transactions in block " )
153
+ case . transaction( let tx) :
154
+ guard let hash = tx. hash else {
155
+ throw Web3Error . processingError ( desc: " Failed to get transaction hash " )
164
156
}
157
+ let subresultPromise = try self . parseTransactionByHashPromise ( hash)
158
+ pendingEvents. append ( subresultPromise)
159
+ case . hash( let hash) :
160
+ let subresultPromise = try self . parseTransactionByHashPromise ( hash)
161
+ pendingEvents. append ( subresultPromise)
165
162
}
163
+ }
166
164
167
- when ( resolved: pendingEvents) . done ( on: queue) { ( results: [ PromiseResult < [ EventParserResultProtocol ] > ] ) throws in
168
- var allResults = [ EventParserResultProtocol] ( )
169
- for res in results {
170
- guard case . fulfilled( let subresult) = res else {
171
- throw Web3Error . processingError ( desc: " Failed to parse event for one transaction in block " )
172
- }
173
- allResults. append ( contentsOf: subresult)
165
+ when ( resolved: pendingEvents) . done ( on: queue) { ( results: [ PromiseResult < [ EventParserResultProtocol ] > ] ) throws in
166
+ var allResults = [ EventParserResultProtocol] ( )
167
+ for res in results {
168
+ guard case . fulfilled( let subresult) = res else {
169
+ throw Web3Error . processingError ( desc: " Failed to parse event for one transaction in block " )
174
170
}
175
- seal. fulfill ( allResults)
176
- }
177
- . catch ( on: queue) { err in
178
- seal. reject ( err)
171
+ allResults. append ( contentsOf: subresult)
179
172
}
173
+ seal. fulfill ( allResults)
174
+ }
175
+ . catch ( on: queue) { err in
176
+ seal. reject ( err)
180
177
}
181
178
179
+
182
180
}
183
181
184
182
}
@@ -206,9 +204,8 @@ extension web3.web3contract {
206
204
}
207
205
208
206
extension web3 . web3contract {
209
- public func getIndexedEventsPromise( eventName: String ? , filter: EventFilter , joinWithReceipts: Bool = false ) -> Promise < [ EventParserResultProtocol ] > {
210
- let queue = self . web3. requestDispatcher. queue
211
- do {
207
+ public func getIndexedEventsPromise( eventName: String ? , filter: EventFilter , joinWithReceipts: Bool = false ) async throws -> [ EventParserResultProtocol ] {
208
+
212
209
let rawContract = self . contract
213
210
guard let preEncoding = encodeTopicToGetLogs ( contract: rawContract, eventName: eventName, filter: filter) else {
214
211
throw Web3Error . processingError ( desc: " Failed to encode topic for request " )
@@ -220,52 +217,50 @@ extension web3.web3contract {
220
217
}
221
218
}
222
219
let request = JSONRPCRequestFabric . prepareRequest ( . getLogs, parameters: [ preEncoding] )
223
- let fetchLogsPromise = self . web3. dispatch ( request) . map ( on: queue) { response throws -> [ EventParserResult ] in
224
- guard let value: [ EventLog ] = response. getValue ( ) else {
225
- if response. error != nil {
226
- throw Web3Error . nodeError ( desc: response. error!. message)
227
- }
228
- throw Web3Error . nodeError ( desc: " Empty or malformed response " )
229
- }
230
- let allLogs = value
231
- let decodedLogs = allLogs. compactMap ( { ( log) -> EventParserResult ? in
232
- let ( n, d) = self . contract. parseEvent ( log)
233
- guard let evName = n, let evData = d else { return nil }
234
- var res = EventParserResult ( eventName: evName, transactionReceipt: nil , contractAddress: log. address, decodedResult: evData)
235
- res. eventLog = log
236
- return res
237
- } ) . filter { ( res: EventParserResult ? ) -> Bool in
238
- if eventName != nil {
239
- if res != nil && res? . eventName == eventName && res!. eventLog != nil {
240
- return true
241
- }
242
- } else {
243
- if res != nil && res!. eventLog != nil {
244
- return true
245
- }
246
- }
247
- return false
220
+ let response = try await self . web3. dispatch ( request)
221
+
222
+ guard let allLogs: [ EventLog ] = response. getValue ( ) else {
223
+ if response. error != nil {
224
+ throw Web3Error . nodeError ( desc: response. error!. message)
248
225
}
249
- return decodedLogs
226
+ throw Web3Error . nodeError ( desc: " Empty or malformed response " )
227
+ }
228
+
229
+
230
+ let decodedLogs = allLogs. compactMap { ( log) -> EventParserResult ? in
231
+ let ( n, d) = self . contract. parseEvent ( log)
232
+ guard let evName = n, let evData = d else { return nil }
233
+ var res = EventParserResult ( eventName: evName, transactionReceipt: nil , contractAddress: log. address, decodedResult: evData)
234
+ res. eventLog = log
235
+ return res
250
236
}
237
+ . filter { res in res. eventLog != nil || ( res. eventName == eventName && eventName != nil ) }
238
+
239
+
251
240
if ( !joinWithReceipts) {
252
- return fetchLogsPromise. mapValues ( on: queue) { res -> EventParserResultProtocol in
253
- return res as EventParserResultProtocol
254
- }
241
+ return decodedLogs as [ EventParserResultProtocol ]
255
242
}
256
- return fetchLogsPromise. thenMap ( on: queue) { singleEvent in
257
- return self . web3. eth. getTransactionReceiptPromise ( singleEvent. eventLog!. transactionHash) . map ( on: queue) { receipt in
243
+
244
+
245
+ return await withTaskGroup ( of: EventParserResultProtocol . self, returning: [ EventParserResultProtocol ] . self) { group -> [ EventParserResultProtocol ] in
246
+
247
+ decodedLogs. forEach { singleEvent in
248
+ group. addTask {
258
249
var joinedEvent = singleEvent
250
+ let receipt = try ? await self . web3. eth. getTransactionReceiptPromise ( singleEvent. eventLog!. transactionHash)
259
251
joinedEvent. transactionReceipt = receipt
260
252
return joinedEvent as EventParserResultProtocol
261
253
}
262
254
}
263
- } catch {
264
- let returnPromise = Promise< [ EventParserResultProtocol] > . pending( )
265
- queue. async {
266
- returnPromise. resolver. reject ( error)
255
+
256
+ var collected = [ EventParserResultProtocol] ( )
257
+
258
+ for await value in group {
259
+ collected. append ( value)
267
260
}
268
- return returnPromise. promise
261
+
262
+ return collected
263
+
269
264
}
270
265
}
271
266
}
0 commit comments