Skip to content

Commit 275aed8

Browse files
increase code coverage, ignore double insertions to bridge_archive table
1 parent 44774fa commit 275aed8

File tree

4 files changed

+79
-32
lines changed

4 files changed

+79
-32
lines changed

bridgesync/downloader_test.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func TestBuildAppender(t *testing.T) {
5555
eventSignature common.Hash
5656
deploymentKind BridgeDeployment
5757
logBuilder func() (types.Log, error)
58+
expectedErr string
5859
}{
5960
{
6061
name: "bridgeEventSignature appender",
@@ -372,6 +373,12 @@ func TestBuildAppender(t *testing.T) {
372373
return l, nil
373374
},
374375
},
376+
{
377+
name: "unknown deployment kind",
378+
deploymentKind: 100,
379+
logBuilder: func() (types.Log, error) { return types.Log{}, nil },
380+
expectedErr: "unsupported bridge deployment kind: 100",
381+
},
375382
}
376383

377384
for _, tt := range tests {
@@ -382,17 +389,21 @@ func TestBuildAppender(t *testing.T) {
382389
logger := logger.WithFields("module", "test")
383390
bridgeDeployment.kind = tt.deploymentKind
384391
appenderMap, err := buildAppender(ethClient, bridgeAddr, false, bridgeDeployment, logger)
385-
require.NoError(t, err)
386-
require.NotNil(t, appenderMap)
392+
if tt.expectedErr == "" {
393+
require.NoError(t, err)
394+
require.NotNil(t, appenderMap)
387395

388-
block := &sync.EVMBlock{EVMBlockHeader: sync.EVMBlockHeader{Num: blockNum}}
396+
block := &sync.EVMBlock{EVMBlockHeader: sync.EVMBlockHeader{Num: blockNum}}
389397

390-
appenderFunc, exists := appenderMap[tt.eventSignature]
391-
require.True(t, exists)
398+
appenderFunc, exists := appenderMap[tt.eventSignature]
399+
require.True(t, exists)
392400

393-
err = appenderFunc(block, log)
394-
require.NoError(t, err)
395-
require.Len(t, block.Events, 1)
401+
err = appenderFunc(block, log)
402+
require.NoError(t, err)
403+
require.Len(t, block.Events, 1)
404+
} else {
405+
require.ErrorContains(t, err, tt.expectedErr)
406+
}
396407
})
397408
}
398409
}

bridgesync/migrations/bridgesync0011.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ CREATE TRIGGER IF NOT EXISTS archive_bridge_before_delete
4242
BEFORE DELETE ON bridge
4343
FOR EACH ROW
4444
BEGIN
45-
INSERT INTO bridge_archive (
45+
INSERT OR IGNORE INTO bridge_archive (
4646
deposit_count,
4747
block_num,
4848
block_pos,

bridgesync/processor.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,21 +1203,27 @@ func (p *processor) Reorg(ctx context.Context, firstReorgedBlock uint64) error {
12031203
// 2. Restore bridge rows from archive for each interval
12041204
// ---------------------------------------------------------------------
12051205
for _, backwardLET := range backwardLETs {
1206-
if backwardLET.PreviousDepositCount.Cmp(backwardLET.NewDepositCount) <= 0 {
1207-
continue // malformed but safe to skip
1206+
if backwardLET.PreviousDepositCount == nil || !backwardLET.PreviousDepositCount.IsUint64() {
1207+
return fmt.Errorf("invalid previous deposit count: %d", backwardLET.PreviousDepositCount)
12081208
}
12091209

1210-
if _, err := tx.Exec(bridgeRestoreSQL, backwardLET.NewDepositCount, backwardLET.NewDepositCount); err != nil {
1210+
if backwardLET.PreviousDepositCount == nil || !backwardLET.PreviousDepositCount.IsUint64() {
1211+
return fmt.Errorf("invalid new deposit count: %d", backwardLET.NewDepositCount)
1212+
}
1213+
1214+
prevDepositCount := backwardLET.PreviousDepositCount.Uint64()
1215+
newDepositCount := backwardLET.NewDepositCount.Uint64()
1216+
if _, err := tx.Exec(bridgeRestoreSQL, newDepositCount, prevDepositCount); err != nil {
12111217
return fmt.Errorf("failed to restore bridges from bridge archive (range %d..%d): %w",
1212-
backwardLET.NewDepositCount, backwardLET.PreviousDepositCount, err)
1218+
newDepositCount, prevDepositCount, err)
12131219
}
12141220

12151221
// Remove restored rows from archive
12161222
_, err := tx.Exec(`DELETE FROM bridge_archive
1217-
WHERE deposit_count > $1 AND deposit_count <= $2`, backwardLET.NewDepositCount, backwardLET.PreviousDepositCount)
1223+
WHERE deposit_count > $1 AND deposit_count <= $2`, newDepositCount, prevDepositCount)
12181224
if err != nil {
12191225
return fmt.Errorf("failed to delete restored rows from archive (range %d..%d): %w",
1220-
backwardLET.NewDepositCount, backwardLET.PreviousDepositCount, err)
1226+
newDepositCount, prevDepositCount, err)
12211227
}
12221228
}
12231229

@@ -1369,10 +1375,9 @@ func (p *processor) ProcessBlock(ctx context.Context, block sync.Block) error {
13691375

13701376
// remove all the bridges whose deposit_count is greater than the one captured by the BackwardLET event
13711377
deleteBridges := fmt.Sprintf("DELETE from %s WHERE deposit_count > $1", bridgeTableName)
1372-
_, err := tx.Exec(deleteBridges, newDepositCount)
1378+
_, err := tx.Exec(deleteBridges, newDepositCountU64)
13731379
if err != nil {
1374-
p.log.Errorf("failed to remove bridges whose deposit count is greater than or equal to %d",
1375-
event.BackwardLET.NewDepositCount)
1380+
p.log.Errorf("failed to remove bridges whose deposit count is greater than %d", newDepositCountU64)
13761381
return err
13771382
}
13781383

bridgesync/processor_test.go

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/0xPolygon/cdk-contracts-tooling/contracts/aggchain-multisig/polygonzkevmbridge"
2121
bridgetypes "github.com/agglayer/aggkit/bridgeservice/types"
2222
"github.com/agglayer/aggkit/bridgesync/migrations"
23+
bridgesynctypes "github.com/agglayer/aggkit/bridgesync/types"
2324
"github.com/agglayer/aggkit/db"
2425
"github.com/agglayer/aggkit/log"
2526
"github.com/agglayer/aggkit/sync"
@@ -320,6 +321,18 @@ func TestProcessor(t *testing.T) {
320321
eventsToClaims(block5.Events),
321322
)),
322323
},
324+
&reorgAction{
325+
p: p,
326+
description: "reorg the last block",
327+
firstReorgedBlock: 5,
328+
},
329+
&getLastProcessedBlockAction{
330+
p: p,
331+
description: "after last block reorged",
332+
ctx: context.Background(),
333+
expectedLastProcessedBlock: 4,
334+
expectedErr: nil,
335+
},
323336
}
324337

325338
for _, a := range actions {
@@ -339,22 +352,22 @@ var (
339352
Event{Bridge: &Bridge{
340353
BlockNum: 1,
341354
BlockPos: 0,
342-
LeafType: 1,
355+
LeafType: bridgesynctypes.LeafTypeAsset.Uint8(),
343356
OriginNetwork: 1,
344-
OriginAddress: common.HexToAddress("01"),
357+
OriginAddress: common.HexToAddress("1"),
345358
DestinationNetwork: 1,
346-
DestinationAddress: common.HexToAddress("01"),
359+
DestinationAddress: common.HexToAddress("1"),
347360
Amount: big.NewInt(1),
348-
Metadata: common.Hex2Bytes("01"),
361+
Metadata: common.Hex2Bytes("1"),
349362
DepositCount: 0,
350363
}},
351364
Event{Claim: &Claim{
352365
BlockNum: 1,
353366
BlockPos: 1,
354367
GlobalIndex: big.NewInt(1),
355368
OriginNetwork: 1,
356-
OriginAddress: common.HexToAddress("01"),
357-
DestinationAddress: common.HexToAddress("01"),
369+
OriginAddress: common.HexToAddress("1"),
370+
DestinationAddress: common.HexToAddress("1"),
358371
Amount: big.NewInt(1),
359372
MainnetExitRoot: common.Hash{},
360373
}},
@@ -390,27 +403,39 @@ var (
390403
Event{Bridge: &Bridge{
391404
BlockNum: 3,
392405
BlockPos: 0,
393-
LeafType: 2,
406+
LeafType: bridgesynctypes.LeafTypeAsset.Uint8(),
394407
OriginNetwork: 2,
395-
OriginAddress: common.HexToAddress("02"),
408+
OriginAddress: common.HexToAddress("2"),
396409
DestinationNetwork: 2,
397-
DestinationAddress: common.HexToAddress("02"),
410+
DestinationAddress: common.HexToAddress("2"),
398411
Amount: big.NewInt(2),
399-
Metadata: common.Hex2Bytes("02"),
412+
Metadata: common.Hex2Bytes("2"),
400413
DepositCount: 1,
401414
}},
402415
Event{Bridge: &Bridge{
403416
BlockNum: 3,
404417
BlockPos: 1,
405-
LeafType: 3,
418+
LeafType: bridgesynctypes.LeafTypeAsset.Uint8(),
406419
OriginNetwork: 3,
407-
OriginAddress: common.HexToAddress("03"),
420+
OriginAddress: common.HexToAddress("3"),
408421
DestinationNetwork: 3,
409-
DestinationAddress: common.HexToAddress("03"),
422+
DestinationAddress: common.HexToAddress("3"),
410423
Amount: big.NewInt(0),
411-
Metadata: common.Hex2Bytes("03"),
424+
Metadata: common.Hex2Bytes("3"),
412425
DepositCount: 2,
413426
}},
427+
Event{Bridge: &Bridge{
428+
BlockNum: 3,
429+
BlockPos: 2,
430+
LeafType: bridgesynctypes.LeafTypeAsset.Uint8(),
431+
OriginNetwork: 3,
432+
OriginAddress: common.HexToAddress("4"),
433+
DestinationNetwork: 3,
434+
DestinationAddress: common.HexToAddress("4"),
435+
Amount: big.NewInt(0),
436+
Metadata: common.Hex2Bytes("4"),
437+
DepositCount: 3,
438+
}},
414439
},
415440
}
416441
block4 = sync.Block{
@@ -453,6 +478,12 @@ var (
453478
BlockPos: 3,
454479
LegacyTokenAddress: common.HexToAddress("0x11"),
455480
}},
481+
Event{BackwardLET: &BackwardLET{
482+
BlockNum: 5,
483+
BlockPos: 4,
484+
PreviousDepositCount: big.NewInt(3),
485+
NewDepositCount: big.NewInt(2),
486+
}},
456487
},
457488
}
458489
)

0 commit comments

Comments
 (0)