@@ -56,6 +56,7 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
5656 }
5757
5858 happyCaseLogs := []string {"computed sync actions" }
59+ noBlocksLogs := []string {"no blocks in state" }
5960
6061 type TestCase struct {
6162 name string
@@ -68,6 +69,7 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
6869 expected syncActions
6970 expectedSeqOutOfSync bool
7071 expectedLogs []string
72+ preferLocalSafeL2 bool
7173 }
7274
7375 testCases := []TestCase {
@@ -95,10 +97,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
9597 // although the sequencer has derived up the same
9698 // L1 block height, it derived fewer safe L2 blocks.
9799 newSyncStatus : eth.SyncStatus {
98- HeadL1 : eth.BlockRef {Number : 6 },
99- CurrentL1 : eth.BlockRef {Number : 1 },
100- LocalSafeL2 : eth.L2BlockRef {Number : 100 , L1Origin : eth.BlockID {Number : 1 }},
101- UnsafeL2 : eth.L2BlockRef {Number : 109 },
100+ HeadL1 : eth.BlockRef {Number : 6 },
101+ CurrentL1 : eth.BlockRef {Number : 1 },
102+ SafeL2 : eth.L2BlockRef {Number : 100 , L1Origin : eth.BlockID {Number : 1 }},
103+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
102104 },
103105 prevCurrentL1 : eth.BlockRef {Number : 1 },
104106 blocks : queue.Queue [* types.Block ]{block102 , block103 }, // note absence of block101
@@ -113,10 +115,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
113115 // This can happen if another batcher instance got some blocks
114116 // included in the safe chain:
115117 newSyncStatus : eth.SyncStatus {
116- HeadL1 : eth.BlockRef {Number : 6 },
117- CurrentL1 : eth.BlockRef {Number : 2 },
118- LocalSafeL2 : eth.L2BlockRef {Number : 104 , L1Origin : eth.BlockID {Number : 1 }},
119- UnsafeL2 : eth.L2BlockRef {Number : 109 },
118+ HeadL1 : eth.BlockRef {Number : 6 },
119+ CurrentL1 : eth.BlockRef {Number : 2 },
120+ SafeL2 : eth.L2BlockRef {Number : 104 , L1Origin : eth.BlockID {Number : 1 }},
121+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
120122 },
121123 prevCurrentL1 : eth.BlockRef {Number : 1 },
122124 blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -131,10 +133,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
131133 // This can happen if there is an L1 reorg, the safe chain is at an acceptable
132134 // height but it does not descend from the blocks in state:
133135 newSyncStatus : eth.SyncStatus {
134- HeadL1 : eth.BlockRef {Number : 5 },
135- CurrentL1 : eth.BlockRef {Number : 2 },
136- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }}, // note hash mismatch
137- UnsafeL2 : eth.L2BlockRef {Number : 109 },
136+ HeadL1 : eth.BlockRef {Number : 5 },
137+ CurrentL1 : eth.BlockRef {Number : 2 },
138+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }}, // note hash mismatch
139+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
138140 },
139141 prevCurrentL1 : eth.BlockRef {Number : 1 },
140142 blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -149,10 +151,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
149151 // This could happen if the batcher unexpectedly violates the
150152 // Holocene derivation rules:
151153 newSyncStatus : eth.SyncStatus {
152- HeadL1 : eth.BlockRef {Number : 3 },
153- CurrentL1 : eth.BlockRef {Number : 2 },
154- LocalSafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
155- UnsafeL2 : eth.L2BlockRef {Number : 109 },
154+ HeadL1 : eth.BlockRef {Number : 3 },
155+ CurrentL1 : eth.BlockRef {Number : 2 },
156+ SafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
157+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
156158 },
157159 prevCurrentL1 : eth.BlockRef {Number : 1 },
158160 blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -166,10 +168,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
166168 {name : "failed to make expected progress (unsafe=safe)" ,
167169 // Edge case where unsafe = safe
168170 newSyncStatus : eth.SyncStatus {
169- HeadL1 : eth.BlockRef {Number : 3 },
170- CurrentL1 : eth.BlockRef {Number : 2 },
171- LocalSafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
172- UnsafeL2 : eth.L2BlockRef {Number : 101 },
171+ HeadL1 : eth.BlockRef {Number : 3 },
172+ CurrentL1 : eth.BlockRef {Number : 2 },
173+ SafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
174+ UnsafeL2 : eth.L2BlockRef {Number : 101 },
173175 },
174176 prevCurrentL1 : eth.BlockRef {Number : 1 },
175177 blocks : queue.Queue [* types.Block ]{block102 , block103 },
@@ -185,10 +187,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
185187 // and we didn't submit or have any txs confirmed since
186188 // the last sync.
187189 newSyncStatus : eth.SyncStatus {
188- HeadL1 : eth.BlockRef {Number : 4 },
189- CurrentL1 : eth.BlockRef {Number : 1 },
190- LocalSafeL2 : eth.L2BlockRef {Number : 100 },
191- UnsafeL2 : eth.L2BlockRef {Number : 109 },
190+ HeadL1 : eth.BlockRef {Number : 4 },
191+ CurrentL1 : eth.BlockRef {Number : 1 },
192+ SafeL2 : eth.L2BlockRef {Number : 100 },
193+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
192194 },
193195 prevCurrentL1 : eth.BlockRef {Number : 1 },
194196 blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -201,10 +203,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
201203 {name : "no blocks" ,
202204 // This happens when the batcher is starting up for the first time
203205 newSyncStatus : eth.SyncStatus {
204- HeadL1 : eth.BlockRef {Number : 5 },
205- CurrentL1 : eth.BlockRef {Number : 2 },
206- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
207- UnsafeL2 : eth.L2BlockRef {Number : 109 },
206+ HeadL1 : eth.BlockRef {Number : 5 },
207+ CurrentL1 : eth.BlockRef {Number : 2 },
208+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
209+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
208210 },
209211 prevCurrentL1 : eth.BlockRef {Number : 1 },
210212 blocks : queue.Queue [* types.Block ]{},
@@ -217,10 +219,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
217219 {name : "happy path" ,
218220 // This happens when the safe chain is being progressed as expected:
219221 newSyncStatus : eth.SyncStatus {
220- HeadL1 : eth.BlockRef {Number : 5 },
221- CurrentL1 : eth.BlockRef {Number : 2 },
222- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
223- UnsafeL2 : eth.L2BlockRef {Number : 109 },
222+ HeadL1 : eth.BlockRef {Number : 5 },
223+ CurrentL1 : eth.BlockRef {Number : 2 },
224+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
225+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
224226 },
225227 prevCurrentL1 : eth.BlockRef {Number : 1 },
226228 blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -234,10 +236,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
234236 },
235237 {name : "happy path + multiple channels" ,
236238 newSyncStatus : eth.SyncStatus {
237- HeadL1 : eth.BlockRef {Number : 5 },
238- CurrentL1 : eth.BlockRef {Number : 2 },
239- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
240- UnsafeL2 : eth.L2BlockRef {Number : 109 },
239+ HeadL1 : eth.BlockRef {Number : 5 },
240+ CurrentL1 : eth.BlockRef {Number : 2 },
241+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
242+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
241243 },
242244 prevCurrentL1 : eth.BlockRef {Number : 1 },
243245 blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 , block104 },
@@ -251,23 +253,23 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
251253 },
252254 {name : "no progress + unsafe=safe" ,
253255 newSyncStatus : eth.SyncStatus {
254- HeadL1 : eth.BlockRef {Number : 5 },
255- CurrentL1 : eth.BlockRef {Number : 2 },
256- LocalSafeL2 : eth.L2BlockRef {Number : 100 },
257- UnsafeL2 : eth.L2BlockRef {Number : 100 },
256+ HeadL1 : eth.BlockRef {Number : 5 },
257+ CurrentL1 : eth.BlockRef {Number : 2 },
258+ SafeL2 : eth.L2BlockRef {Number : 100 },
259+ UnsafeL2 : eth.L2BlockRef {Number : 100 },
258260 },
259261 prevCurrentL1 : eth.BlockRef {Number : 1 },
260262 blocks : queue.Queue [* types.Block ]{},
261263 channels : []channelStatuser {},
262264 expected : syncActions {},
263- expectedLogs : [] string { "no blocks in state" } ,
265+ expectedLogs : noBlocksLogs ,
264266 },
265267 {name : "no progress + unsafe=safe + blocks in state" ,
266268 newSyncStatus : eth.SyncStatus {
267- HeadL1 : eth.BlockRef {Number : 5 },
268- CurrentL1 : eth.BlockRef {Number : 2 },
269- LocalSafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash ()},
270- UnsafeL2 : eth.L2BlockRef {Number : 101 },
269+ HeadL1 : eth.BlockRef {Number : 5 },
270+ CurrentL1 : eth.BlockRef {Number : 2 },
271+ SafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash ()},
272+ UnsafeL2 : eth.L2BlockRef {Number : 101 },
271273 },
272274 prevCurrentL1 : eth.BlockRef {Number : 1 },
273275 blocks : queue.Queue [* types.Block ]{block101 },
@@ -277,6 +279,54 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
277279 },
278280 expectedLogs : happyCaseLogs ,
279281 },
282+ {name : "localSafeL2 > safeL2, preferLocalSafeL2=false" ,
283+ newSyncStatus : eth.SyncStatus {
284+ HeadL1 : eth.BlockRef {Number : 5 },
285+ CurrentL1 : eth.BlockRef {Number : 2 },
286+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
287+ LocalSafeL2 : eth.L2BlockRef {Number : 104 , Hash : block104 .Hash ()},
288+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
289+ },
290+ prevCurrentL1 : eth.BlockRef {Number : 1 },
291+ blocks : queue.Queue [* types.Block ]{},
292+ channels : []channelStatuser {},
293+ expected : syncActions {
294+ blocksToLoad : & inclusiveBlockRange {104 , 109 },
295+ },
296+ expectedLogs : noBlocksLogs ,
297+ },
298+ {name : "localSafeL2 > safeL2, preferLocalSafeL2=true" ,
299+ preferLocalSafeL2 : true ,
300+ newSyncStatus : eth.SyncStatus {
301+ HeadL1 : eth.BlockRef {Number : 5 },
302+ CurrentL1 : eth.BlockRef {Number : 2 },
303+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
304+ LocalSafeL2 : eth.L2BlockRef {Number : 104 , Hash : block104 .Hash ()},
305+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
306+ },
307+ prevCurrentL1 : eth.BlockRef {Number : 1 },
308+ blocks : queue.Queue [* types.Block ]{},
309+ channels : []channelStatuser {},
310+ expected : syncActions {
311+ blocksToLoad : & inclusiveBlockRange {105 , 109 },
312+ },
313+ expectedLogs : noBlocksLogs ,
314+ },
315+ {name : "LocalSafeL2=0,SafeL2>0" , // This shouldn't ever happen, but has occurred due to bugs
316+ newSyncStatus : eth.SyncStatus {
317+ HeadL1 : eth.BlockRef {Number : 5 },
318+ CurrentL1 : eth.BlockRef {Number : 2 },
319+ SafeL2 : eth.L2BlockRef {Number : 104 , Hash : block104 .Hash ()},
320+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
321+ },
322+ prevCurrentL1 : eth.BlockRef {Number : 1 },
323+ blocks : queue.Queue [* types.Block ]{},
324+ channels : []channelStatuser {},
325+ expected : syncActions {
326+ blocksToLoad : & inclusiveBlockRange {105 , 109 },
327+ },
328+ expectedLogs : noBlocksLogs ,
329+ },
280330 }
281331
282332 for _ , tc := range testCases {
@@ -285,7 +335,7 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
285335 l , h := testlog .CaptureLogger (t , log .LevelDebug )
286336
287337 result , outOfSync := computeSyncActions (
288- tc .newSyncStatus , tc .prevCurrentL1 , tc .blocks , tc .channels , l ,
338+ tc .newSyncStatus , tc .prevCurrentL1 , tc .blocks , tc .channels , l , tc . preferLocalSafeL2 ,
289339 )
290340
291341 require .Equal (t , tc .expected , result , "unexpected actions" )
0 commit comments