diff --git a/aggoracle/e2e_test.go b/aggoracle/e2e_test.go index c39bf60b..648791eb 100644 --- a/aggoracle/e2e_test.go +++ b/aggoracle/e2e_test.go @@ -13,19 +13,19 @@ import ( ) func TestEVM(t *testing.T) { - env := helpers.NewE2EEnvWithEVML2(t) + setup := helpers.NewE2EEnvWithEVML2(t) for i := 0; i < 10; i++ { - _, err := env.GERL1Contract.UpdateExitRoot(env.AuthL1, common.HexToHash(strconv.Itoa(i))) + _, err := setup.L1Environment.GERContract.UpdateExitRoot(setup.L1Environment.Auth, common.HexToHash(strconv.Itoa(i))) require.NoError(t, err) - env.L1Client.Commit() + setup.L1Environment.SimBackend.Commit() - // wait for the GER to be processed by the L1InfoTree syncer + // wait for the GER to be processed by the InfoTree syncer time.Sleep(time.Millisecond * 100) - expectedGER, err := env.GERL1Contract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + expectedGER, err := setup.L1Environment.GERContract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) require.NoError(t, err) - isInjected, err := env.AggOracleSender.IsGERInjected(expectedGER) + isInjected, err := setup.L2Environment.AggoracleSender.IsGERInjected(expectedGER) require.NoError(t, err) require.True(t, isInjected, fmt.Sprintf("iteration %d, GER: %s", i, common.Bytes2Hex(expectedGER[:]))) diff --git a/bridgesync/e2e_test.go b/bridgesync/e2e_test.go index 61e45674..4b1fc94a 100644 --- a/bridgesync/e2e_test.go +++ b/bridgesync/e2e_test.go @@ -22,7 +22,7 @@ func TestBridgeEventE2E(t *testing.T) { maxReorgDepth = 2 reorgEveryXIterations = 4 // every X blocks go back [1,maxReorgDepth] blocks ) - env := helpers.NewE2EEnvWithEVML2(t) + setup := helpers.NewE2EEnvWithEVML2(t) ctx := context.Background() // Send bridge txs bridgesSent := 0 @@ -39,8 +39,8 @@ func TestBridgeEventE2E(t *testing.T) { Metadata: []byte{}, } lastDepositCount++ - tx, err := env.BridgeL1Contract.BridgeAsset( - env.AuthL1, + tx, err := setup.L1Environment.BridgeContract.BridgeAsset( + setup.L1Environment.Auth, bridge.DestinationNetwork, bridge.DestinationAddress, bridge.Amount, @@ -48,11 +48,11 @@ func TestBridgeEventE2E(t *testing.T) { true, nil, ) require.NoError(t, err) - helpers.CommitBlocks(t, env.L1Client, 1, blockTime) - bn, err := env.L1Client.Client().BlockNumber(ctx) + helpers.CommitBlocks(t, setup.L1Environment.SimBackend, 1, blockTime) + bn, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) require.NoError(t, err) bridge.BlockNum = bn - receipt, err := env.L1Client.Client().TransactionReceipt(ctx, tx.Hash()) + receipt, err := setup.L1Environment.SimBackend.Client().TransactionReceipt(ctx, tx.Hash()) require.NoError(t, err) require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) expectedBridges = append(expectedBridges, bridge) @@ -61,9 +61,9 @@ func TestBridgeEventE2E(t *testing.T) { // Trigger reorg if i%reorgEveryXIterations == 0 { blocksToReorg := 1 + i%maxReorgDepth - bn, err := env.L1Client.Client().BlockNumber(ctx) + bn, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) require.NoError(t, err) - helpers.Reorg(t, env.L1Client, uint64(blocksToReorg)) + helpers.Reorg(t, setup.L1Environment.SimBackend, uint64(blocksToReorg)) // Clean expected bridges lastValidBlock := bn - uint64(blocksToReorg) reorgEffective := false @@ -90,20 +90,20 @@ func TestBridgeEventE2E(t *testing.T) { // Wait for syncer to catch up time.Sleep(time.Second * 2) // sleeping since the processor could be up to date, but have pending reorgs - lb, err := env.L1Client.Client().BlockNumber(ctx) + lb, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) require.NoError(t, err) - helpers.RequireProcessorUpdated(t, env.BridgeL1Sync, lb) + helpers.RequireProcessorUpdated(t, setup.L1Environment.BridgeSync, lb) // Get bridges - lastBlock, err := env.L1Client.Client().BlockNumber(ctx) + lastBlock, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) require.NoError(t, err) - actualBridges, err := env.BridgeL1Sync.GetBridges(ctx, 0, lastBlock) + actualBridges, err := setup.L1Environment.BridgeSync.GetBridges(ctx, 0, lastBlock) require.NoError(t, err) // Assert bridges - expectedRoot, err := env.BridgeL1Contract.GetRoot(nil) + expectedRoot, err := setup.L1Environment.BridgeContract.GetRoot(nil) require.NoError(t, err) - root, err := env.BridgeL1Sync.GetExitRootByIndex(ctx, expectedBridges[len(expectedBridges)-1].DepositCount) + root, err := setup.L1Environment.BridgeSync.GetExitRootByIndex(ctx, expectedBridges[len(expectedBridges)-1].DepositCount) require.NoError(t, err) require.Equal(t, common.Hash(expectedRoot).Hex(), root.Hash.Hex()) require.Equal(t, expectedBridges, actualBridges) diff --git a/claimsponsor/e2e_test.go b/claimsponsor/e2e_test.go index c06223b9..5ad332c0 100644 --- a/claimsponsor/e2e_test.go +++ b/claimsponsor/e2e_test.go @@ -21,19 +21,19 @@ import ( func TestE2EL1toEVML2(t *testing.T) { // start other needed components ctx := context.Background() - env := helpers.NewE2EEnvWithEVML2(t) + setup := helpers.NewE2EEnvWithEVML2(t) // start claim sponsor dbPathClaimSponsor := path.Join(t.TempDir(), "claimsponsorTestE2EL1toEVML2_cs.sqlite") claimer, err := claimsponsor.NewEVMClaimSponsor( log.GetDefaultLogger(), dbPathClaimSponsor, - env.L2Client.Client(), - env.BridgeL2Addr, - env.AuthL2.From, + setup.L2Environment.SimBackend.Client(), + setup.L2Environment.BridgeAddr, + setup.L2Environment.Auth.From, 200_000, 0, - env.EthTxManMockL2, + setup.EthTxManagerMock, 0, 0, time.Millisecond*10, time.Millisecond*10, ) require.NoError(t, err) @@ -43,26 +43,26 @@ func TestE2EL1toEVML2(t *testing.T) { for i := uint32(0); i < 3; i++ { // Send bridges to L2, wait for GER to be injected on L2 amount := new(big.Int).SetUint64(uint64(i) + 1) - env.AuthL1.Value = amount - _, err := env.BridgeL1Contract.BridgeAsset(env.AuthL1, env.NetworkIDL2, env.AuthL2.From, amount, common.Address{}, true, nil) + setup.L1Environment.Auth.Value = amount + _, err := setup.L1Environment.BridgeContract.BridgeAsset(setup.L1Environment.Auth, setup.NetworkIDL2, setup.L2Environment.Auth.From, amount, common.Address{}, true, nil) require.NoError(t, err) - env.L1Client.Commit() + setup.L1Environment.SimBackend.Commit() time.Sleep(time.Millisecond * 300) - expectedGER, err := env.GERL1Contract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + expectedGER, err := setup.L1Environment.GERContract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) require.NoError(t, err) - isInjected, err := env.AggOracleSender.IsGERInjected(expectedGER) + isInjected, err := setup.L2Environment.AggoracleSender.IsGERInjected(expectedGER) require.NoError(t, err) require.True(t, isInjected, fmt.Sprintf("iteration %d, GER: %s", i, common.Bytes2Hex(expectedGER[:]))) - // Build MP using bridgeSyncL1 & env.L1InfoTreeSync - info, err := env.L1InfoTreeSync.GetInfoByIndex(ctx, i) + // Build MP using bridgeSyncL1 & env.InfoTreeSync + info, err := setup.L1Environment.InfoTreeSync.GetInfoByIndex(ctx, i) require.NoError(t, err) - localProof, err := env.BridgeL1Sync.GetProof(ctx, i, info.MainnetExitRoot) + localProof, err := setup.L1Environment.BridgeSync.GetProof(ctx, i, info.MainnetExitRoot) require.NoError(t, err) - rollupProof, err := env.L1InfoTreeSync.GetRollupExitTreeMerkleProof(ctx, 0, common.Hash{}) + rollupProof, err := setup.L1Environment.InfoTreeSync.GetRollupExitTreeMerkleProof(ctx, 0, common.Hash{}) require.NoError(t, err) // Request to sponsor claim @@ -76,8 +76,8 @@ func TestE2EL1toEVML2(t *testing.T) { RollupExitRoot: info.RollupExitRoot, OriginNetwork: 0, OriginTokenAddress: common.Address{}, - DestinationNetwork: env.NetworkIDL2, - DestinationAddress: env.AuthL2.From, + DestinationNetwork: setup.NetworkIDL2, + DestinationAddress: setup.L2Environment.Auth.From, Amount: amount, Metadata: nil, }) @@ -100,7 +100,7 @@ func TestE2EL1toEVML2(t *testing.T) { require.True(t, succeed) // Check on contract that is claimed - isClaimed, err := env.BridgeL2Contract.IsClaimed(&bind.CallOpts{Pending: false}, i, 0) + isClaimed, err := setup.L2Environment.BridgeContract.IsClaimed(&bind.CallOpts{Pending: false}, i, 0) require.NoError(t, err) require.True(t, isClaimed) } diff --git a/lastgersync/e2e_test.go b/lastgersync/e2e_test.go index ca956a20..b0782538 100644 --- a/lastgersync/e2e_test.go +++ b/lastgersync/e2e_test.go @@ -18,15 +18,15 @@ import ( func TestE2E(t *testing.T) { ctx := context.Background() - env := helpers.NewE2EEnvWithEVML2(t) + setup := helpers.NewE2EEnvWithEVML2(t) dbPathSyncer := path.Join(t.TempDir(), "lastgersyncTestE2E.sqlite") syncer, err := lastgersync.New( ctx, dbPathSyncer, - env.ReorgDetectorL2, - env.L2Client.Client(), - env.GERL2Addr, - env.L1InfoTreeSync, + setup.L2Environment.ReorgDetector, + setup.L2Environment.SimBackend.Client(), + setup.L2Environment.GERAddr, + setup.InfoTreeSync, 0, 0, etherman.LatestBlock, @@ -38,18 +38,18 @@ func TestE2E(t *testing.T) { for i := 0; i < 10; i++ { // Update GER on L1 - _, err := env.GERL1Contract.UpdateExitRoot(env.AuthL1, common.HexToHash(strconv.Itoa(i))) + _, err := setup.L1Environment.GERContract.UpdateExitRoot(setup.L1Environment.Auth, common.HexToHash(strconv.Itoa(i))) require.NoError(t, err) - env.L1Client.Commit() + setup.L1Environment.SimBackend.Commit() time.Sleep(time.Millisecond * 150) - expectedGER, err := env.GERL1Contract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + expectedGER, err := setup.L1Environment.GERContract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) require.NoError(t, err) - isInjected, err := env.AggOracleSender.IsGERInjected(expectedGER) + isInjected, err := setup.AggoracleSender.IsGERInjected(expectedGER) require.NoError(t, err) require.True(t, isInjected, fmt.Sprintf("iteration %d, GER: %s", i, common.Bytes2Hex(expectedGER[:]))) // Wait for syncer to catch up - lb, err := env.L2Client.Client().BlockNumber(ctx) + lb, err := setup.L2Environment.SimBackend.Client().BlockNumber(ctx) require.NoError(t, err) helpers.RequireProcessorUpdated(t, syncer, lb) diff --git a/test/helpers/e2e.go b/test/helpers/e2e.go index efc45069..a0070885 100644 --- a/test/helpers/e2e.go +++ b/test/helpers/e2e.go @@ -33,32 +33,16 @@ const ( periodRetry = time.Millisecond * 100 ) -type AggoracleWithEVMChainEnv struct { - L1Client *simulated.Backend - L2Client *simulated.Backend - L1InfoTreeSync *l1infotreesync.L1InfoTreeSync - GERL1Contract *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2 - GERL1Addr common.Address - GERL2Contract *globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchain - GERL2Addr common.Address - AuthL1 *bind.TransactOpts - AuthL2 *bind.TransactOpts - AggOracle *aggoracle.AggOracle - AggOracleSender aggoracle.ChainSender - ReorgDetectorL1 *reorgdetector.ReorgDetector - ReorgDetectorL2 *reorgdetector.ReorgDetector - BridgeL1Contract *polygonzkevmbridgev2.Polygonzkevmbridgev2 - BridgeL1Addr common.Address - BridgeL1Sync *bridgesync.BridgeSync - BridgeL2Contract *polygonzkevmbridgev2.Polygonzkevmbridgev2 - BridgeL2Addr common.Address - BridgeL2Sync *bridgesync.BridgeSync - NetworkIDL2 uint32 - EthTxManMockL2 *EthTxManagerMock +type AggoracleWithEVMChain struct { + L1Environment + L2Environment + AggOracle *aggoracle.AggOracle + NetworkIDL2 uint32 } -type SetupResult struct { - Client *simulated.Backend +// CommonEnvironment contains common setup results used in both L1 and L2 network setups. +type CommonEnvironment struct { + SimBackend *simulated.Backend GERAddr common.Address BridgeContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 BridgeAddr common.Address @@ -67,20 +51,23 @@ type SetupResult struct { BridgeSync *bridgesync.BridgeSync } -type L1SetupResult struct { - SetupResult +// L1Environment contains setup results for L1 network. +type L1Environment struct { + CommonEnvironment GERContract *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2 InfoTreeSync *l1infotreesync.L1InfoTreeSync } -type L2SetupResult struct { - SetupResult - GERContract *globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchain - AggoracleSender aggoracle.ChainSender - EthTxManMock *EthTxManagerMock +// L2Environment contains setup results for L1 network. +type L2Environment struct { + CommonEnvironment + GERContract *globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchain + AggoracleSender aggoracle.ChainSender + EthTxManagerMock *EthTxManagerMock } -func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChainEnv { +// NewE2EEnvWithEVML2 creates a new E2E environment with EVM L1 and L2 chains. +func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChain { t.Helper() ctx := context.Background() @@ -92,47 +79,22 @@ func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChainEnv { oracle, err := aggoracle.New( log.GetDefaultLogger(), l2Setup.AggoracleSender, - l1Setup.Client.Client(), l1Setup.InfoTreeSync, + l1Setup.SimBackend.Client(), l1Setup.InfoTreeSync, etherman.LatestBlock, time.Millisecond*20, //nolint:mnd ) require.NoError(t, err) go oracle.Start(ctx) - return &AggoracleWithEVMChainEnv{ - L1Client: l1Setup.Client, - L2Client: l2Setup.Client, - - L1InfoTreeSync: l1Setup.InfoTreeSync, - - GERL1Contract: l1Setup.GERContract, - GERL1Addr: l1Setup.GERAddr, - - GERL2Contract: l2Setup.GERContract, - GERL2Addr: l2Setup.GERAddr, - - AuthL1: l1Setup.Auth, - AuthL2: l2Setup.Auth, - - AggOracle: oracle, - AggOracleSender: l2Setup.AggoracleSender, - - ReorgDetectorL1: l1Setup.ReorgDetector, - ReorgDetectorL2: l2Setup.ReorgDetector, - - BridgeL1Contract: l1Setup.BridgeContract, - BridgeL1Addr: l1Setup.BridgeAddr, - BridgeL1Sync: l1Setup.BridgeSync, - - BridgeL2Contract: l2Setup.BridgeContract, - BridgeL2Addr: l2Setup.BridgeAddr, - BridgeL2Sync: l2Setup.BridgeSync, - - NetworkIDL2: rollupID, - EthTxManMockL2: l2Setup.EthTxManMock, + return &AggoracleWithEVMChain{ + L1Environment: *l1Setup, + L2Environment: *l2Setup, + AggOracle: oracle, + NetworkIDL2: rollupID, } } -func L1Setup(t *testing.T) *L1SetupResult { +// L1Setup creates a new L1 environment. +func L1Setup(t *testing.T) *L1Environment { t.Helper() ctx := context.Background() @@ -181,9 +143,9 @@ func L1Setup(t *testing.T) *L1SetupResult { go bridgeL1Sync.Start(ctx) - return &L1SetupResult{ - SetupResult: SetupResult{ - Client: l1Client, + return &L1Environment{ + CommonEnvironment: CommonEnvironment{ + SimBackend: l1Client, GERAddr: gerL1Addr, BridgeContract: bridgeL1Contract, BridgeAddr: bridgeL1Addr, @@ -196,18 +158,19 @@ func L1Setup(t *testing.T) *L1SetupResult { } } -func L2Setup(t *testing.T) *L2SetupResult { +// L2Setup creates a new L2 environment. +func L2Setup(t *testing.T) *L2Environment { t.Helper() l2Client, authL2, gerL2Addr, gerL2Contract, bridgeL2Addr, bridgeL2Contract := newSimulatedEVML2SovereignChain(t) - ethTxManMock := NewEthTxManMock(t, l2Client, authL2) + ethTxManagerMock := NewEthTxManMock(t, l2Client, authL2) const gerCheckFrequency = time.Millisecond * 50 sender, err := chaingersender.NewEVMChainGERSender( log.GetDefaultLogger(), gerL2Addr, l2Client.Client(), - ethTxManMock, 0, gerCheckFrequency, + ethTxManagerMock, 0, gerCheckFrequency, ) require.NoError(t, err) ctx := context.Background() @@ -240,9 +203,9 @@ func L2Setup(t *testing.T) *L2SetupResult { go bridgeL2Sync.Start(ctx) - return &L2SetupResult{ - SetupResult: SetupResult{ - Client: l2Client, + return &L2Environment{ + CommonEnvironment: CommonEnvironment{ + SimBackend: l2Client, GERAddr: gerL2Addr, BridgeContract: bridgeL2Contract, BridgeAddr: bridgeL2Addr, @@ -250,9 +213,9 @@ func L2Setup(t *testing.T) *L2SetupResult { ReorgDetector: rdL2, BridgeSync: bridgeL2Sync, }, - GERContract: gerL2Contract, - AggoracleSender: sender, - EthTxManMock: ethTxManMock, + GERContract: gerL2Contract, + AggoracleSender: sender, + EthTxManagerMock: ethTxManagerMock, } }