Skip to content

Commit e6c5900

Browse files
feat: decouple validator from metadata
1 parent 1057629 commit e6c5900

19 files changed

+324
-239
lines changed

aggsender/aggsender.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ type AggSender struct {
4141
aggLayerClient agglayer.AgglayerClientInterface
4242
compatibilityStoragedChecker compatibility.CompatibilityChecker
4343
certStatusChecker types.CertificateStatusChecker
44+
certQuerier types.CertificateQuerier
45+
rollupDataQuerier types.RollupDataQuerier
4446

4547
cfg config.Config
4648

@@ -126,6 +128,7 @@ func New(
126128
rateLimiter: rateLimit,
127129
compatibilityStoragedChecker: compatibilityStoragedChecker,
128130
l2OriginNetwork: l2OriginNetwork,
131+
certQuerier: certQuerier,
129132
certStatusChecker: statuschecker.NewCertStatusChecker(
130133
logger, storage, aggLayerClient, certQuerier, l2OriginNetwork),
131134
}, nil
@@ -149,6 +152,14 @@ func (a *AggSender) GetFlow() types.AggsenderFlow {
149152
return a.flow
150153
}
151154

155+
func (a *AggSender) GetCertQuerier() types.CertificateQuerier {
156+
return a.certQuerier
157+
}
158+
159+
func (a *AggSender) GetLERQuerier() types.LERQuerier {
160+
return query.NewLERDataQuerier(a.cfg.RollupCreationBlockL1, a.rollupDataQuerier)
161+
}
162+
152163
func (a *AggSender) Info() types.AggsenderInfo {
153164
res := types.AggsenderInfo{
154165
AggsenderStatus: *a.status,

aggsender/aggsender_validator.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ func NewAggsenderValidator(ctx context.Context,
3434
flowPP validator.FlowInterface,
3535
l1InfoTreeDataQuerier validator.L1InfoTreeRootByLeafQuerier,
3636
aggLayerClient agglayer.AggLayerClientCertificateIDQuerier,
37+
certQuerier types.CertificateQuerier,
38+
lerQuerier types.LERQuerier,
3739
signer signertypes.Signer) (*AggsenderValidator, error) {
3840
validatorCert := validator.NewAggsenderValidator(
39-
logger, flowPP, l1InfoTreeDataQuerier)
41+
logger, flowPP, l1InfoTreeDataQuerier, certQuerier, lerQuerier)
4042
grpcServer, err := grpc.NewServer(cfg.ServerConfig)
4143
if err != nil {
4244
return nil, err

aggsender/aggsender_validator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestNewAggsenderValidator(t *testing.T) {
2323
}
2424
// Call the function
2525
validator, err := NewAggsenderValidator(ctx, mockLogger, cfg, mockFlowPP, mockL1InfoTreeDataQuerier,
26-
mockAggLayerClient, nil)
26+
mockAggLayerClient, nil, nil, nil)
2727

2828
// Assertions
2929
require.NoError(t, err, "Expected no error when creating AggsenderValidator")

aggsender/converters/cert_header_converter.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,27 @@ import (
55

66
agglayertypes "github.com/agglayer/aggkit/agglayer/types"
77
"github.com/agglayer/aggkit/aggsender/types"
8+
aggkitcommon "github.com/agglayer/aggkit/common"
89
)
910

1011
// ConvertAgglayerCertHeaderToAggsender converts an agglayer CertificateHeader to an aggsender CertificateHeader
1112
func ConvertAgglayerCertHeaderToAggsender(cert *agglayertypes.CertificateHeader) (*types.CertificateHeader, error) {
1213
if cert == nil {
1314
return nil, nil
1415
}
15-
metadataUnmarshal, err := types.NewCertificateMetadataFromHash(cert.Metadata)
16-
if err != nil {
17-
return nil, fmt.Errorf("error parsing cert metadata. Err: %w", err)
18-
}
19-
blockRange, err := metadataUnmarshal.BlockRange()
20-
if err != nil {
21-
return nil, fmt.Errorf("cant get blockRange from certificate metadata. Err: %w", err)
16+
17+
blockRange := types.BlockRangeZero
18+
if cert.Metadata != aggkitcommon.ZeroHash {
19+
// TODO - remove this once we completely decouple metadata from the certificate
20+
metadataUnmarshal, err := types.NewCertificateMetadataFromHash(cert.Metadata)
21+
if err != nil {
22+
return nil, fmt.Errorf("error parsing cert metadata. Err: %w", err)
23+
}
24+
br, err := metadataUnmarshal.BlockRange()
25+
if err != nil {
26+
return nil, fmt.Errorf("cant get blockRange from certificate metadata. Err: %w", err)
27+
}
28+
blockRange = br
2229
}
2330

2431
return &types.CertificateHeader{
@@ -33,7 +40,6 @@ func ConvertAgglayerCertHeaderToAggsender(cert *agglayertypes.CertificateHeader)
3340
CreatedAt: 0,
3441
UpdatedAt: 0,
3542
FinalizedL1InfoTreeRoot: nil,
36-
CertType: metadataUnmarshal.CertificateType(),
3743
CertSource: types.CertificateSourceAggLayer,
3844
}, nil
3945
}

aggsender/converters/cert_header_converter_test.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,6 @@ func TestAgglayerCertificateHeaderToAggsender(t *testing.T) {
2727
require.ErrorContains(t, err, "unsupported certificate metadata")
2828
})
2929

30-
t.Run("Can't get blockRange'", func(t *testing.T) {
31-
badMetadata := make([]byte, common.HashLength)
32-
badMetadata[0] = 0x0 // Version = 0x0 doesn't have blockrange
33-
cert := &agglayertypes.CertificateHeader{
34-
Metadata: common.Hash(badMetadata),
35-
}
36-
result, err := ConvertAgglayerCertHeaderToAggsender(cert)
37-
require.Nil(t, result)
38-
require.Error(t, err)
39-
})
40-
4130
t.Run("ok", func(t *testing.T) {
4231
badMetadata := make([]byte, common.HashLength)
4332
badMetadata[0] = 0x1 // Version = 0xff

aggsender/flows/factory.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,7 @@ func NewFlow(
4343
}
4444
logger.Infof("Initializing RollupManager contract at address: %s. Genesis block: %d",
4545
cfg.RollupManagerAddr, cfg.RollupCreationBlockL1)
46-
lerQuerier, err := query.NewLERDataQuerier(
47-
cfg.RollupManagerAddr, cfg.RollupCreationBlockL1, rollupDataQuerier)
48-
if err != nil {
49-
return nil, fmt.Errorf("error creating LER data querier: %w", err)
50-
}
51-
46+
lerQuerier := query.NewLERDataQuerier(cfg.RollupCreationBlockL1, rollupDataQuerier)
5247
l2BridgeQuerier := query.NewBridgeDataQuerier(logger, l2Syncer, cfg.DelayBetweenRetries.Duration)
5348
l1InfoTreeQuerier := query.NewL1InfoTreeDataQuerier(l1Client, l1InfoTreeSyncer)
5449
logger.Infof("Aggsender signer address: %s", signer.PublicAddress().Hex())
@@ -90,12 +85,7 @@ func NewFlow(
9085
return nil, fmt.Errorf("aggchainProverFlow - error creating optimistic mode querier: %w", err)
9186
}
9287

93-
lerQuerier, err := query.NewLERDataQuerier(
94-
cfg.RollupManagerAddr, cfg.RollupCreationBlockL1, rollupDataQuerier)
95-
if err != nil {
96-
return nil, fmt.Errorf("aggchainProverFlow - error creating LER data querier: %w", err)
97-
}
98-
88+
lerQuerier := query.NewLERDataQuerier(cfg.RollupCreationBlockL1, rollupDataQuerier)
9989
aggchainFEPQuerier, err := query.NewAggchainFEPQuerier(logger, types.AggchainProofMode,
10090
cfg.SovereignRollupAddr, l1Client)
10191
if err != nil {

aggsender/flows/flow_aggchain_prover_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ func Test_AggchainProverFlow_BuildCertificate(t *testing.T) {
507507
{
508508
name: "error building certificate",
509509
mockFn: func(mockL2BridgeQuerier *mocks.BridgeQuerier, mockLERQuerier *mocks.LERQuerier, mockSigner *mocks.Signer) {
510-
mockLERQuerier.EXPECT().GetLastLocalExitRoot().Return(types.EmptyLER, nil)
510+
mockLERQuerier.EXPECT().GetStartLER().Return(types.EmptyLER, nil)
511511
mockL2BridgeQuerier.EXPECT().GetExitRootByIndex(mock.Anything, uint32(0)).Return(common.Hash{}, errors.New("some error"))
512512
},
513513
buildParams: &types.CertificateBuildParams{
@@ -525,7 +525,7 @@ func Test_AggchainProverFlow_BuildCertificate(t *testing.T) {
525525
mockL2BridgeQuerier.EXPECT().OriginNetwork().Return(uint32(1))
526526
mockSigner.EXPECT().PublicAddress().Return(common.HexToAddress("0x123"))
527527
mockSigner.EXPECT().SignHash(mock.Anything, mock.Anything).Return([]byte("signature"), nil)
528-
mockLERQuerier.EXPECT().GetLastLocalExitRoot().Return(types.EmptyLER, nil)
528+
mockLERQuerier.EXPECT().GetStartLER().Return(types.EmptyLER, nil)
529529
},
530530
buildParams: &types.CertificateBuildParams{
531531
FromBlock: 1,

aggsender/flows/flow_base.go

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -339,25 +339,11 @@ func (f *baseFlow) getImportedBridgeExits(
339339
ctx, claims, rootFromWhichToProve, f.l1InfoTreeDataQuerier)
340340
}
341341

342-
// getStartLER returns the last local exit root (LER) based on the configuration
343-
func (f *baseFlow) getStartLER() (common.Hash, error) {
344-
ler, err := f.lerQuerier.GetLastLocalExitRoot()
345-
if err != nil {
346-
return common.Hash{}, fmt.Errorf("error getting last local exit root: %w", err)
347-
}
348-
349-
if ler == aggkitcommon.ZeroHash {
350-
return types.EmptyLER, nil
351-
}
352-
353-
return ler, nil
354-
}
355-
356342
// getNextHeightAndPreviousLER returns the height and previous LER for the new certificate
357343
func (f *baseFlow) getNextHeightAndPreviousLER(
358344
lastSentCertificateInfo *types.CertificateHeader) (uint64, common.Hash, error) {
359345
if lastSentCertificateInfo == nil {
360-
ler, err := f.getStartLER()
346+
ler, err := f.lerQuerier.GetStartLER()
361347
return uint64(0), ler, err
362348
}
363349
if !lastSentCertificateInfo.Status.IsClosed() {
@@ -375,7 +361,7 @@ func (f *baseFlow) getNextHeightAndPreviousLER(
375361
}
376362
// Is the first one, so we can set the zeroLER
377363
if lastSentCertificateInfo.Height == 0 {
378-
ler, err := f.getStartLER()
364+
ler, err := f.lerQuerier.GetStartLER()
379365
return uint64(0), ler, err
380366
}
381367
// We get previous certificate that must be settled

aggsender/flows/flow_base_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ func Test_baseFlow_getNextHeightAndPreviousLER(t *testing.T) {
334334
expectedHeight: 0,
335335
expectedLER: types.EmptyLER,
336336
mockFn: func(mockLERQuerier *mocks.LERQuerier, mockStorage *mocks.AggSenderStorage) {
337-
mockLERQuerier.EXPECT().GetLastLocalExitRoot().Return(aggkitcommon.ZeroHash, nil)
337+
mockLERQuerier.EXPECT().GetStartLER().Return(types.EmptyLER, nil)
338338
},
339339
},
340340
{
@@ -343,17 +343,17 @@ func Test_baseFlow_getNextHeightAndPreviousLER(t *testing.T) {
343343
expectedHeight: 0,
344344
expectedLER: common.HexToHash("0x1"),
345345
mockFn: func(mockLERQuerier *mocks.LERQuerier, mockStorage *mocks.AggSenderStorage) {
346-
mockLERQuerier.EXPECT().GetLastLocalExitRoot().Return(common.HexToHash("0x1"), nil)
346+
mockLERQuerier.EXPECT().GetStartLER().Return(common.HexToHash("0x1"), nil)
347347
},
348348
},
349349
{
350350
name: "ler querier returns error",
351351
lastSentCert: nil,
352352
expectedHeight: 0,
353353
expectedLER: aggkitcommon.ZeroHash,
354-
expectedError: "error getting last local exit root: some error",
354+
expectedError: "some error",
355355
mockFn: func(mockLERQuerier *mocks.LERQuerier, mockStorage *mocks.AggSenderStorage) {
356-
mockLERQuerier.EXPECT().GetLastLocalExitRoot().Return(common.Hash{}, errors.New("some error"))
356+
mockLERQuerier.EXPECT().GetStartLER().Return(common.Hash{}, errors.New("some error"))
357357
},
358358
},
359359
{
@@ -397,7 +397,7 @@ func Test_baseFlow_getNextHeightAndPreviousLER(t *testing.T) {
397397
expectedHeight: 0,
398398
expectedLER: types.EmptyLER,
399399
mockFn: func(mockLERQuerier *mocks.LERQuerier, mockStorage *mocks.AggSenderStorage) {
400-
mockLERQuerier.EXPECT().GetLastLocalExitRoot().Return(types.EmptyLER, nil)
400+
mockLERQuerier.EXPECT().GetStartLER().Return(types.EmptyLER, nil)
401401
},
402402
},
403403
{

aggsender/mocks/mock_ler_querier.go

Lines changed: 57 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)