@@ -19,7 +19,7 @@ use serde_json::Value;
19
19
20
20
use crate :: ccip:: handle_ccip;
21
21
use crate :: utils:: { build_reqwest, decode_bytes, dns_encode} ;
22
- use crate :: CCIPReadMiddlewareError ;
22
+ use crate :: { CCIPReadMiddlewareError , CCIPRequest } ;
23
23
24
24
#[ derive( Debug , Clone ) ]
25
25
pub struct CCIPReadMiddleware < M > {
@@ -229,7 +229,8 @@ impl<M: Middleware> CCIPReadMiddleware<M> {
229
229
transaction : & TypedTransaction ,
230
230
block_id : Option < BlockId > ,
231
231
attempt : u8 ,
232
- ) -> Result < Bytes , CCIPReadMiddlewareError < M > > {
232
+ requests_buffer : & mut Vec < CCIPRequest > ,
233
+ ) -> Result < ( Bytes , Vec < CCIPRequest > ) , CCIPReadMiddlewareError < M > > {
233
234
if attempt >= self . max_redirect_attempt {
234
235
// may need more info
235
236
return Err ( CCIPReadMiddlewareError :: MaxRedirectionError ) ;
@@ -258,14 +259,14 @@ impl<M: Middleware> CCIPReadMiddleware<M> {
258
259
259
260
if !matches ! ( block_id. unwrap_or( BlockId :: Number ( BlockNumber :: Latest ) ) , BlockId :: Number ( block) if block. is_latest( ) )
260
261
{
261
- return Ok ( result) ;
262
+ return Ok ( ( result, requests_buffer . to_vec ( ) ) ) ;
262
263
}
263
264
264
265
if tx_sender. is_zero ( )
265
266
|| !result. starts_with ( OFFCHAIN_LOOKUP_SELECTOR )
266
267
|| result. len ( ) % 32 != 4
267
268
{
268
- return Ok ( result) ;
269
+ return Ok ( ( result, requests_buffer . to_vec ( ) ) ) ;
269
270
}
270
271
271
272
let output_types = vec ! [
@@ -292,7 +293,7 @@ impl<M: Middleware> CCIPReadMiddleware<M> {
292
293
decoded_data. get ( 4 ) ,
293
294
)
294
295
else {
295
- return Ok ( result) ;
296
+ return Ok ( ( result, requests_buffer . to_vec ( ) ) ) ;
296
297
} ;
297
298
298
299
let urls: Vec < String > = urls
@@ -310,9 +311,11 @@ impl<M: Middleware> CCIPReadMiddleware<M> {
310
311
} ) ;
311
312
}
312
313
313
- let ccip_result =
314
+ let ( ccip_result, requests ) =
314
315
handle_ccip ( & self . reqwest_client , sender, transaction, calldata, urls) . await ?;
315
316
317
+ requests_buffer. extend ( requests) ;
318
+
316
319
if ccip_result. is_empty ( ) {
317
320
return Err ( CCIPReadMiddlewareError :: GatewayNotFoundError ) ;
318
321
}
@@ -327,7 +330,19 @@ impl<M: Middleware> CCIPReadMiddleware<M> {
327
330
[ callback_selector. clone ( ) , encoded_data. clone ( ) ] . concat ( ) ,
328
331
) ) ;
329
332
330
- self . _call ( & callback_tx, block_id, attempt + 1 ) . await
333
+ self . _call ( & callback_tx, block_id, attempt + 1 , requests_buffer)
334
+ . await
335
+ }
336
+
337
+ /// Call the underlying middleware with the provided transaction and block,
338
+ /// returning both the result of the call and the CCIP requests made during the call
339
+ pub async fn call_ccip (
340
+ & self ,
341
+ tx : & TypedTransaction ,
342
+ block : Option < BlockId > ,
343
+ ) -> Result < ( Bytes , Vec < CCIPRequest > ) , CCIPReadMiddlewareError < M > > {
344
+ let mut requests = Vec :: new ( ) ;
345
+ self . _call ( tx, block, 0 , & mut requests) . await
331
346
}
332
347
}
333
348
@@ -353,7 +368,7 @@ where
353
368
tx : & TypedTransaction ,
354
369
block : Option < BlockId > ,
355
370
) -> Result < Bytes , Self :: Error > {
356
- return self . _call ( tx, block, 0 ) . await ;
371
+ Ok ( self . call_ccip ( tx, block) . await ? . 0 )
357
372
}
358
373
359
374
/**
0 commit comments