From 3a1ea020c945d527aadd66eabf2705ed043cb2df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Negovanovi=C4=87?= Date: Wed, 18 Dec 2024 16:15:39 +0100 Subject: [PATCH] refactor: simulated backend so that it correctly initializes bridge contract --- aggoracle/e2e_test.go | 22 +-- bridgesync/e2e_test.go | 4 +- claimsponsor/e2e_test.go | 29 ++-- .../datacommittee/datacommittee_test.go | 12 +- l1infotreesync/e2e_test.go | 10 +- test/helpers/e2e.go | 26 +++- test/helpers/ethtxmanmock_e2e.go | 4 +- test/helpers/simulated.go | 132 ++++++++++-------- 8 files changed, 127 insertions(+), 112 deletions(-) diff --git a/aggoracle/e2e_test.go b/aggoracle/e2e_test.go index eb4d466c0..c39bf60bd 100644 --- a/aggoracle/e2e_test.go +++ b/aggoracle/e2e_test.go @@ -6,40 +6,26 @@ import ( "testing" "time" - gerContractL1 "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain-paris/polygonzkevmglobalexitrootv2" - "github.com/0xPolygon/cdk/aggoracle" "github.com/0xPolygon/cdk/test/helpers" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/stretchr/testify/require" ) func TestEVM(t *testing.T) { env := helpers.NewE2EEnvWithEVML2(t) - runTest(t, env.GERL1Contract, env.AggOracleSender, env.L1Client, env.AuthL1) -} - -func runTest( - t *testing.T, - gerL1Contract *gerContractL1.Polygonzkevmglobalexitrootv2, - sender aggoracle.ChainSender, - l1Client *simulated.Backend, - authL1 *bind.TransactOpts, -) { - t.Helper() for i := 0; i < 10; i++ { - _, err := gerL1Contract.UpdateExitRoot(authL1, common.HexToHash(strconv.Itoa(i))) + _, err := env.GERL1Contract.UpdateExitRoot(env.AuthL1, common.HexToHash(strconv.Itoa(i))) require.NoError(t, err) - l1Client.Commit() + env.L1Client.Commit() // wait for the GER to be processed by the L1InfoTree syncer time.Sleep(time.Millisecond * 100) - expectedGER, err := gerL1Contract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + expectedGER, err := env.GERL1Contract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) require.NoError(t, err) - isInjected, err := sender.IsGERInjected(expectedGER) + isInjected, err := env.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 3c1e166ea..be63c9805 100644 --- a/bridgesync/e2e_test.go +++ b/bridgesync/e2e_test.go @@ -24,7 +24,6 @@ func TestBridgeEventE2E(t *testing.T) { ) env := helpers.NewE2EEnvWithEVML2(t) ctx := context.Background() - // Send bridge txs bridgesSent := 0 reorgs := 0 @@ -35,7 +34,7 @@ func TestBridgeEventE2E(t *testing.T) { bridge := bridgesync.Bridge{ Amount: big.NewInt(0), DepositCount: lastDepositCount, - DestinationNetwork: uint32(i), + DestinationNetwork: uint32(i + 1), DestinationAddress: common.HexToAddress("f00"), Metadata: []byte{}, } @@ -48,6 +47,7 @@ func TestBridgeEventE2E(t *testing.T) { bridge.OriginAddress, true, nil, ) + t.Logf("BridgeAsset err: %+v", err) require.NoError(t, err) helpers.CommitBlocks(t, env.L1Client, 1, blockTime) bn, err := env.L1Client.Client().BlockNumber(ctx) diff --git a/claimsponsor/e2e_test.go b/claimsponsor/e2e_test.go index 8299d2b5d..c06223b9e 100644 --- a/claimsponsor/e2e_test.go +++ b/claimsponsor/e2e_test.go @@ -67,21 +67,20 @@ func TestE2EL1toEVML2(t *testing.T) { // Request to sponsor claim globalIndex := bridgesync.GenerateGlobalIndex(true, 0, i) - err = claimer.AddClaimToQueue( - &claimsponsor.Claim{ - LeafType: claimsponsor.LeafTypeAsset, - ProofLocalExitRoot: localProof, - ProofRollupExitRoot: rollupProof, - GlobalIndex: globalIndex, - MainnetExitRoot: info.MainnetExitRoot, - RollupExitRoot: info.RollupExitRoot, - OriginNetwork: 0, - OriginTokenAddress: common.Address{}, - DestinationNetwork: env.NetworkIDL2, - DestinationAddress: env.AuthL2.From, - Amount: amount, - Metadata: nil, - }) + err = claimer.AddClaimToQueue(&claimsponsor.Claim{ + LeafType: claimsponsor.LeafTypeAsset, + ProofLocalExitRoot: localProof, + ProofRollupExitRoot: rollupProof, + GlobalIndex: globalIndex, + MainnetExitRoot: info.MainnetExitRoot, + RollupExitRoot: info.RollupExitRoot, + OriginNetwork: 0, + OriginTokenAddress: common.Address{}, + DestinationNetwork: env.NetworkIDL2, + DestinationAddress: env.AuthL2.From, + Amount: amount, + Metadata: nil, + }) require.NoError(t, err) // Wait until success diff --git a/dataavailability/datacommittee/datacommittee_test.go b/dataavailability/datacommittee/datacommittee_test.go index 7e2a8d3e0..2cc009ad8 100644 --- a/dataavailability/datacommittee/datacommittee_test.go +++ b/dataavailability/datacommittee/datacommittee_test.go @@ -5,10 +5,10 @@ import ( "math/big" "testing" - smcparis "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana-paris/polygondatacommittee" + scparis "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana-paris/polygondatacommittee" "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygondatacommittee" "github.com/0xPolygon/cdk/log" - erc1967proxy "github.com/0xPolygon/cdk/test/contracts/erc1967proxy" + "github.com/0xPolygon/cdk/test/contracts/erc1967proxy" "github.com/0xPolygon/cdk/test/helpers" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -20,7 +20,7 @@ import ( func TestUpdateDataCommitteeEvent(t *testing.T) { // Set up testing environment - dac, ethBackend, da, auth := newSimulatedDacman(t) + dac, ethBackend, da, auth := newSimulatedDACBackend(t) // Update the committee requiredAmountOfSignatures := big.NewInt(2) @@ -65,7 +65,7 @@ func init() { // NewSimulatedEtherman creates an etherman that uses a simulated blockchain. It's important to notice that the ChainID of the auth // must be 1337. The address that holds the auth will have an initial balance of 10 ETH -func newSimulatedDacman(t *testing.T) ( +func newSimulatedDACBackend(t *testing.T) ( *Backend, *simulated.Backend, *polygondatacommittee.Polygondatacommittee, @@ -73,10 +73,10 @@ func newSimulatedDacman(t *testing.T) ( ) { t.Helper() - ethBackend, setup := helpers.SimulatedBackend(t, nil, 0) + ethBackend, setup := helpers.NewSimulatedBackend(t, nil) // DAC Setup - addr, _, _, err := smcparis.DeployPolygondatacommittee(setup.UserAuth, ethBackend.Client()) + addr, _, _, err := scparis.DeployPolygondatacommittee(setup.UserAuth, ethBackend.Client()) require.NoError(t, err) ethBackend.Commit() diff --git a/l1infotreesync/e2e_test.go b/l1infotreesync/e2e_test.go index 885d2bff2..9084bf854 100644 --- a/l1infotreesync/e2e_test.go +++ b/l1infotreesync/e2e_test.go @@ -35,21 +35,23 @@ func newSimulatedClient(t *testing.T) ( ) { t.Helper() ctx := context.Background() - client, setup := helpers.SimulatedBackend(t, nil, 0) + client, setup := helpers.NewSimulatedBackend(t, nil) nonce, err := client.Client().PendingNonceAt(ctx, setup.UserAuth.From) require.NoError(t, err) - precalculatedAddr := crypto.CreateAddress(setup.UserAuth.From, nonce+1) - verifyAddr, _, verifyContract, err := verifybatchesmock.DeployVerifybatchesmock(setup.UserAuth, client.Client(), precalculatedAddr) + precalculatedGERAddr := crypto.CreateAddress(setup.UserAuth.From, nonce+1) + verifyAddr, _, verifyContract, err := verifybatchesmock.DeployVerifybatchesmock(setup.UserAuth, client.Client(), precalculatedGERAddr) require.NoError(t, err) client.Commit() gerAddr, _, gerContract, err := polygonzkevmglobalexitrootv2.DeployPolygonzkevmglobalexitrootv2(setup.UserAuth, client.Client(), verifyAddr, setup.UserAuth.From) require.NoError(t, err) + require.Equal(t, precalculatedGERAddr, gerAddr) client.Commit() - require.Equal(t, precalculatedAddr, gerAddr) + err = setup.DeployBridge(client, gerAddr, 0) + require.NoError(t, err) return client, setup.UserAuth, gerAddr, verifyAddr, gerContract, verifyContract } diff --git a/test/helpers/e2e.go b/test/helpers/e2e.go index eb7413917..963d7268c 100644 --- a/test/helpers/e2e.go +++ b/test/helpers/e2e.go @@ -59,11 +59,13 @@ func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChainEnv { t.Helper() ctx := context.Background() + // Setup L1 l1Client, syncer, gerL1Contract, gerL1Addr, bridgeL1Contract, bridgeL1Addr, authL1, rdL1, bridgeL1Sync := CommonSetup(t) + // Setup L2 EVM sender, l2Client, gerL2Contract, gerL2Addr, bridgeL2Contract, bridgeL2Addr, authL2, ethTxManMockL2, bridgeL2Sync, rdL2 := L2SetupEVM(t) @@ -123,7 +125,6 @@ func CommonSetup(t *testing.T) ( ) { t.Helper() - // Config and spin up ctx := context.Background() // Simulated L1 @@ -245,9 +246,17 @@ func newSimulatedL1(t *testing.T) ( ) { t.Helper() - client, setup := SimulatedBackend(t, nil, 0) + client, setup := NewSimulatedBackend(t, nil) - expectedGERAddr := crypto.CreateAddress(setup.DeployerAuth.From, 2) //nolint:mnd + ctx := context.Background() + nonce, err := client.Client().PendingNonceAt(ctx, setup.DeployerAuth.From) + require.NoError(t, err) + + // DeployBridge function sends two transactions (bridge and proxy contract deployment) + calculatedGERAddr := crypto.CreateAddress(setup.DeployerAuth.From, nonce+2) //nolint:mnd + + err = setup.DeployBridge(client, calculatedGERAddr, 0) + require.NoError(t, err) gerAddr, _, gerContract, err := polygonzkevmglobalexitrootv2.DeployPolygonzkevmglobalexitrootv2( setup.DeployerAuth, client.Client(), @@ -255,7 +264,7 @@ func newSimulatedL1(t *testing.T) ( require.NoError(t, err) client.Commit() - require.Equal(t, expectedGERAddr, gerAddr) + require.Equal(t, calculatedGERAddr, gerAddr) return client, setup.UserAuth, gerAddr, gerContract, setup.BridgeProxyAddr, setup.BridgeProxyContract } @@ -270,7 +279,7 @@ func newSimulatedEVML2SovereignChain(t *testing.T) ( ) { t.Helper() - client, setup := SimulatedBackend(t, nil, rollupID) + client, setup := NewSimulatedBackend(t, nil) gerL2Addr, _, _, err := globalexitrootmanagerl2sovereignchain.DeployGlobalexitrootmanagerl2sovereignchain( setup.DeployerAuth, client.Client(), setup.BridgeProxyAddr) @@ -298,5 +307,12 @@ func newSimulatedEVML2SovereignChain(t *testing.T) ( gerProxyAddr, client.Client()) require.NoError(t, err) + err = setup.DeployBridge(client, gerProxyAddr, rollupID) + require.NoError(t, err) + + actualGERAddr, err := setup.BridgeProxyContract.GlobalExitRootManager(nil) + require.NoError(t, err) + require.Equal(t, gerProxyAddr, actualGERAddr) + return client, setup.UserAuth, gerProxyAddr, gerL2Contract, setup.BridgeProxyAddr, setup.BridgeProxyContract } diff --git a/test/helpers/ethtxmanmock_e2e.go b/test/helpers/ethtxmanmock_e2e.go index 92a8546c7..5a07fa19f 100644 --- a/test/helpers/ethtxmanmock_e2e.go +++ b/test/helpers/ethtxmanmock_e2e.go @@ -60,11 +60,11 @@ func NewEthTxManMock( gas, err := client.Client().EstimateGas(ctx, msg) if err != nil { - log.Errorf("eth_estimateGas invocation failed: %s", err) + log.Errorf("eth_estimateGas invocation failed: %+v", err) res, err := client.Client().CallContract(ctx, msg, nil) if err != nil { - log.Errorf("eth_call invocation failed: %s", err) + log.Errorf("eth_call invocation failed: %+v", err) } else { log.Debugf("contract call result: %s", hex.EncodeToString(res)) } diff --git a/test/helpers/simulated.go b/test/helpers/simulated.go index 48bc4893a..3ee864623 100644 --- a/test/helpers/simulated.go +++ b/test/helpers/simulated.go @@ -1,6 +1,7 @@ package helpers import ( + "fmt" "math/big" "testing" @@ -39,11 +40,71 @@ type SimulatedBackendSetup struct { BridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 } -// SimulatedBackend creates a simulated backend with two accounts: user and deployer. -func SimulatedBackend( - t *testing.T, - balances map[common.Address]types.Account, - rollupID uint32, +// DeployBridge deploys the bridge contract +func (s *SimulatedBackendSetup) DeployBridge(client *simulated.Backend, + gerAddr common.Address, networkID uint32) error { + // Deploy zkevm bridge contract + bridgeAddr, _, _, err := polygonzkevmbridgev2.DeployPolygonzkevmbridgev2(s.DeployerAuth, client.Client()) + if err != nil { + return err + } + client.Commit() + + // Create proxy contract for the bridge + var ( + bridgeProxyAddr common.Address + bridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 + ) + + bridgeABI, err := polygonzkevmbridgev2.Polygonzkevmbridgev2MetaData.GetAbi() + if err != nil { + return err + } + + // TODO: @Stefan-Ethernal parameterize gasTokenAddress and gasTokenNetwork if necessary + dataCallProxy, err := bridgeABI.Pack("initialize", + networkID, + common.Address{}, // gasTokenAddressMainnet + uint32(0), // gasTokenNetworkMainnet + gerAddr, // global exit root manager + common.Address{}, // rollup manager + []byte{}, // gasTokenMetadata + ) + if err != nil { + return err + } + + bridgeProxyAddr, _, _, err = transparentupgradableproxy.DeployTransparentupgradableproxy( + s.DeployerAuth, + client.Client(), + bridgeAddr, + s.DeployerAuth.From, + dataCallProxy, + ) + if err != nil { + return err + } + client.Commit() + + bridgeProxyContract, err = polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridgeProxyAddr, client.Client()) + if err != nil { + return err + } + + actualGERAddr, err := bridgeProxyContract.GlobalExitRootManager(&bind.CallOpts{}) + if gerAddr != actualGERAddr { + return fmt.Errorf("mismatch between expected %s and actual %s GER addresses on bridge contract (%s)", + gerAddr, actualGERAddr, bridgeProxyAddr) + } + + s.BridgeProxyAddr = bridgeProxyAddr + s.BridgeProxyContract = bridgeProxyContract + + return err +} + +// NewSimulatedBackend creates a simulated backend with two accounts: user and deployer. +func NewSimulatedBackend(t *testing.T, balances map[common.Address]types.Account, ) (*simulated.Backend, *SimulatedBackendSetup) { t.Helper() @@ -51,13 +112,13 @@ func SimulatedBackend( balance, ok := new(big.Int).SetString(defaultBalance, 10) //nolint:mnd require.Truef(t, ok, "failed to set balance") - // Create user + // Create user account userPK, err := crypto.GenerateKey() require.NoError(t, err) userAuth, err := bind.NewKeyedTransactorWithChainID(userPK, big.NewInt(chainID)) require.NoError(t, err) - // Create deployer + // Create deployer account deployerPK, err := crypto.GenerateKey() require.NoError(t, err) deployerAuth, err := bind.NewKeyedTransactorWithChainID(deployerPK, big.NewInt(chainID)) @@ -77,59 +138,10 @@ func SimulatedBackend( // Mine the first block client.Commit() - // MUST BE DEPLOYED FIRST - // Deploy zkevm bridge contract - bridgeAddr, _, _, err := polygonzkevmbridgev2.DeployPolygonzkevmbridgev2(deployerAuth, client.Client()) - require.NoError(t, err) - client.Commit() - - // Create proxy contract for the bridge - var ( - bridgeProxyAddr common.Address - bridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 - ) - - { - calculatedGERAddr := crypto.CreateAddress(deployerAuth.From, 2) //nolint:mnd - - bridgeABI, err := polygonzkevmbridgev2.Polygonzkevmbridgev2MetaData.GetAbi() - require.NoError(t, err) - require.NotNil(t, bridgeABI) - - dataCallProxy, err := bridgeABI.Pack("initialize", - rollupID, - common.Address{}, // gasTokenAddressMainnet - uint32(0), // gasTokenNetworkMainnet - calculatedGERAddr, - common.Address{}, - []byte{}, // gasTokenMetadata - ) - require.NoError(t, err) - - bridgeProxyAddr, _, _, err = transparentupgradableproxy.DeployTransparentupgradableproxy( - deployerAuth, - client.Client(), - bridgeAddr, - deployerAuth.From, - dataCallProxy, - ) - require.NoError(t, err) - require.Equal(t, precalculatedBridgeAddr, bridgeProxyAddr) - client.Commit() - - bridgeProxyContract, err = polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridgeProxyAddr, client.Client()) - require.NoError(t, err) - - actualGERAddr, err := bridgeProxyContract.GlobalExitRootManager(&bind.CallOpts{}) - require.NoError(t, err) - require.Equal(t, calculatedGERAddr, actualGERAddr) + setup := &SimulatedBackendSetup{ + UserAuth: userAuth, + DeployerAuth: deployerAuth, } - return client, - &SimulatedBackendSetup{ - UserAuth: userAuth, - DeployerAuth: deployerAuth, - BridgeProxyAddr: bridgeProxyAddr, - BridgeProxyContract: bridgeProxyContract, - } + return client, setup }