Skip to content

Commit

Permalink
feat: Prevent missconfiguration of bridgeAddress in bridgesyncer (#187)
Browse files Browse the repository at this point in the history
  • Loading branch information
joanestebanr authored Feb 7, 2025
1 parent 270f6bc commit 73b5449
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 2 deletions.
24 changes: 24 additions & 0 deletions bridgesync/bridgesync.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package bridgesync

import (
"context"
"fmt"
"time"

"github.com/0xPolygon/cdk-contracts-tooling/contracts/etrog/polygonzkevmbridgev2"
"github.com/agglayer/aggkit/etherman"
"github.com/agglayer/aggkit/log"
"github.com/agglayer/aggkit/sync"
Expand Down Expand Up @@ -117,6 +119,13 @@ func newBridgeSync(
syncFullClaims bool,
) (*BridgeSync, error) {
logger := log.WithFields("module", syncerID)

err := sanityCheckContract(logger, bridge, ethClient)
if err != nil {
logger.Errorf("sanityCheckContract(bridge:%s) fails sanity check. Err: %w",
bridge.String(), err)
return nil, err
}
processor, err := newProcessor(dbPath, logger)
if err != nil {
return nil, err
Expand Down Expand Up @@ -283,3 +292,18 @@ func (s *BridgeSync) OriginNetwork() uint32 {
func (s *BridgeSync) BlockFinality() etherman.BlockNumberFinality {
return s.blockFinality
}

func sanityCheckContract(logger *log.Logger, bridgeAddr common.Address, ethClient EthClienter) error {
contract, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridgeAddr, ethClient)
if err != nil {
return fmt.Errorf("sanityCheckContract(bridge:%s) fails creating contract. Err: %w", bridgeAddr.String(), err)
}
lastUpdatedDespositCount, err := contract.LastUpdatedDepositCount(nil)
if err != nil {
return fmt.Errorf("sanityCheckContract(bridge:%s) fails getting lastUpdatedDespositCount. Err: %w",
bridgeAddr.String(), err)
}
logger.Infof("sanityCheckContract(bridge:%s) OK. lastUpdatedDespositCount: %d",
bridgeAddr.String(), lastUpdatedDespositCount)
return nil
}
25 changes: 25 additions & 0 deletions bridgesync/bridgesync_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ func TestNewLx(t *testing.T) {
var blockFinalityType = etherman.SafeBlock

mockEthClient := mocksbridgesync.NewEthClienter(t)
mockEthClient.EXPECT().CallContract(mock.Anything, mock.Anything, mock.Anything).Return(
common.FromHex("0x000000000000000000000000000000000000000000000000000000000000002a"), nil).Times(2)
mockReorgDetector := mocksbridgesync.NewReorgDetector(t)

mockReorgDetector.EXPECT().Subscribe(mock.Anything).Return(nil, nil)
Expand Down Expand Up @@ -86,6 +88,29 @@ func TestNewLx(t *testing.T) {
assert.NotNil(t, l1BridgeSync)
assert.Equal(t, originNetwork, l2BridgdeSync.OriginNetwork())
assert.Equal(t, blockFinalityType, l2BridgdeSync.BlockFinality())

// Fails the sanity check of the contract address
mockEthClient = mocksbridgesync.NewEthClienter(t)
mockEthClient.EXPECT().CallContract(mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Once()
mockEthClient.EXPECT().CodeAt(mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Once()
l2BridgdeSyncErr, err := NewL2(
ctx,
dbPath,
bridge,
syncBlockChunkSize,
blockFinalityType,
mockReorgDetector,
mockEthClient,
initialBlock,
waitForNewBlocksPeriod,
retryAfterErrorPeriod,
maxRetryAttemptsAfterError,
originNetwork,
false,
)
t.Log(err)
assert.Error(t, err)
assert.Nil(t, l2BridgdeSyncErr)
}

func TestGetLastProcessedBlock(t *testing.T) {
Expand Down
15 changes: 13 additions & 2 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ const (
SaveConfigFileName = "aggkit_config.toml"

DefaultCreationFilePermissions = os.FileMode(0600)

bridgeAddrSetOnWrongSection = "Bridge contract address must be set in the root of config file as polygonBridgeAddr."
)

type DeprecatedFieldsError struct {
Expand Down Expand Up @@ -74,7 +76,16 @@ type DeprecatedField struct {
}

var (
deprecatedFieldsOnConfig = []DeprecatedField{}
deprecatedFieldsOnConfig = []DeprecatedField{
{
FieldNamePattern: "L1Config.polygonBridgeAddr",
Reason: bridgeAddrSetOnWrongSection,
},
{
FieldNamePattern: "L2Config.polygonBridgeAddr",
Reason: bridgeAddrSetOnWrongSection,
},
}
)

/*
Expand Down Expand Up @@ -286,7 +297,7 @@ func checkDeprecatedFields(keysOnConfig []string) error {

func getDeprecatedField(fieldName string) *DeprecatedField {
for _, deprecatedField := range deprecatedFieldsOnConfig {
if deprecatedField.FieldNamePattern == fieldName {
if strings.ToLower(deprecatedField.FieldNamePattern) == strings.ToLower(fieldName) {
return &deprecatedField
}
// If the field name ends with a dot, it means FieldNamePattern*
Expand Down
14 changes: 14 additions & 0 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,17 @@ func newCliContextConfigFlag(t *testing.T, values ...string) *cli.Context {
}
return cli.NewContext(nil, flagSet, nil)
}

func TestLoadConfigWithDeprecatedFields(t *testing.T) {
tmpFile, err := os.CreateTemp("", "ut_config")
require.NoError(t, err)
defer os.Remove(tmpFile.Name())
_, err = tmpFile.Write([]byte(`
[L1Config]
polygonBridgeAddr = "0x0000000000000000000000000000000000000000"
`))
require.NoError(t, err)
ctx := newCliContextConfigFlag(t, tmpFile.Name())
_, err = Load(ctx)
require.Error(t, err)
}

0 comments on commit 73b5449

Please sign in to comment.