@@ -11,8 +11,12 @@ use tracing::{error, info, warn};
11
11
12
12
use crate :: queue:: BundleQueue ;
13
13
14
+ // Polling interval to check for next delayed inbox index
14
15
const INBOX_DELAY : Duration = Duration :: from_secs ( 60 ) ;
15
16
17
+ // Max lookback for `from_block` to `to_block` in our `Filter` request
18
+ const MAX_BLOCK_LOOKBACK : u64 = 300 ;
19
+
16
20
sol ! {
17
21
event InboxMessageDelivered ( uint256 indexed messageNum, bytes data) ;
18
22
event InboxMessageDeliveredFromOrigin ( uint256 indexed messageNum) ;
@@ -29,12 +33,12 @@ pub struct DelayedInbox<N: Network> {
29
33
impl < N : Network > DelayedInbox < N > {
30
34
pub async fn connect (
31
35
node : PublicKey ,
32
- url : String ,
36
+ url : & str ,
33
37
ibox_addr : Address ,
34
38
parent_chain_id : u64 ,
35
39
queue : BundleQueue ,
36
40
) -> Result < Self , Error > {
37
- let provider = RootProvider :: < N > :: connect ( & url)
41
+ let provider = RootProvider :: < N > :: connect ( url)
38
42
. await
39
43
. map_err ( |e| Error :: RpcError ( e. to_string ( ) ) ) ?;
40
44
let rpc_chain_id = provider
@@ -50,13 +54,13 @@ impl<N: Network> DelayedInbox<N> {
50
54
ibox_addr,
51
55
provider,
52
56
queue,
53
- url,
57
+ url : url . to_string ( ) ,
54
58
} )
55
59
}
56
60
57
61
pub async fn go ( self ) {
58
- let mut last_finalized = 0 ;
59
- let mut last_delayed_index = 0 ;
62
+ let mut prev_finalized = 0 ;
63
+ let mut prev_delayed_idx = 0 ;
60
64
let events = vec ! [
61
65
InboxMessageDelivered :: SIGNATURE ,
62
66
InboxMessageDeliveredFromOrigin :: SIGNATURE ,
@@ -69,22 +73,26 @@ impl<N: Network> DelayedInbox<N> {
69
73
. await
70
74
{
71
75
let finalized = b. header ( ) . number ( ) ;
72
- if finalized == last_finalized {
76
+ if finalized == prev_finalized {
77
+ // Nothing to do
73
78
sleep ( INBOX_DELAY ) . await ;
74
79
continue ;
75
80
}
76
- if last_finalized == 0 {
77
- last_finalized = finalized. saturating_sub ( 300 ) ;
81
+ // To prevent large rpc queries go from finalized - MAX_BLOCK_LOOKBACK
82
+ // This is fine because we only need the latest finalized delayed message to set the
83
+ // index
84
+ if finalized. saturating_sub ( prev_finalized) > MAX_BLOCK_LOOKBACK {
85
+ prev_finalized = finalized. saturating_sub ( MAX_BLOCK_LOOKBACK ) ;
78
86
}
79
87
80
88
// Filter for the `InboxMessageDelivered` and `InboxMessageDeliveredFromOrigin`
81
89
// between our last finalized and current finalized on the L1 contract
82
90
let filter = Filter :: new ( )
83
91
. address ( self . ibox_addr )
84
- . from_block ( last_finalized )
92
+ . from_block ( prev_finalized )
85
93
. to_block ( finalized)
86
94
. events ( & events) ;
87
- last_finalized = finalized;
95
+ prev_finalized = finalized;
88
96
89
97
if let Ok ( mut logs) = self . provider . get_logs ( & filter) . await {
90
98
// Make sure event logs are in order, we need highest block number first then
@@ -99,14 +107,14 @@ impl<N: Network> DelayedInbox<N> {
99
107
. map ( |log| ( log. transaction_hash , log. topics ( ) . get ( 1 ) ) )
100
108
{
101
109
// Update delayed index if newer
102
- let delayed_index = U256 :: from_be_bytes ( index. 0 )
110
+ let delayed_idx = U256 :: from_be_bytes ( index. 0 )
103
111
. try_into ( )
104
112
. expect ( "valid msg number" ) ;
105
- if delayed_index != last_delayed_index {
106
- debug_assert ! ( delayed_index > last_delayed_index ) ;
107
- info ! ( node = %self . node, %delayed_index , parent_finalized_block = %finalized, ibox_addr = %self . ibox_addr, %tx_hash, "delayed index updated" ) ;
108
- last_delayed_index = delayed_index ;
109
- self . queue . set_delayed_inbox_index ( delayed_index . into ( ) ) ;
113
+ if delayed_idx != prev_delayed_idx {
114
+ debug_assert ! ( delayed_idx > prev_delayed_idx ) ;
115
+ info ! ( node = %self . node, %delayed_idx , parent_finalized_block = %finalized, ibox_addr = %self . ibox_addr, %tx_hash, "delayed index updated" ) ;
116
+ prev_delayed_idx = delayed_idx ;
117
+ self . queue . set_delayed_inbox_index ( delayed_idx . into ( ) ) ;
110
118
}
111
119
}
112
120
}
0 commit comments