From 973741e80e33d413e2414ef26cfd0458cb74e01c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Negovanovi=C4=87?= <stefan@ethernal.tech>
Date: Thu, 12 Dec 2024 15:25:35 +0100
Subject: [PATCH] integrate new contracts for the aggoracle (wip)

---
 aggoracle/chaingersender/evm.go | 15 +++++-----
 aggoracle/e2e_test.go           |  6 ++--
 go.mod                          |  2 +-
 go.sum                          |  2 ++
 lastgersync/evmdownloader.go    |  6 ++--
 test/helpers/e2e.go             | 51 +++++++++++++++++----------------
 test/helpers/simulated.go       | 19 ++++++------
 7 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/aggoracle/chaingersender/evm.go b/aggoracle/chaingersender/evm.go
index 30f12c9cf..c004208d6 100644
--- a/aggoracle/chaingersender/evm.go
+++ b/aggoracle/chaingersender/evm.go
@@ -6,7 +6,7 @@ import (
 	"math/big"
 	"time"
 
-	"github.com/0xPolygon/cdk-contracts-tooling/contracts/manual/pessimisticglobalexitroot"
+	"github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain-paris/polygonzkevmglobalexitrootv2"
 	cfgTypes "github.com/0xPolygon/cdk/config/types"
 	"github.com/0xPolygon/cdk/log"
 	"github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager"
@@ -41,7 +41,7 @@ type EthTxManager interface {
 
 type EVMChainGERSender struct {
 	logger              *log.Logger
-	gerContract         *pessimisticglobalexitroot.Pessimisticglobalexitroot
+	gerContract         *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2
 	gerAddr             common.Address
 	client              EthClienter
 	ethTxMan            EthTxManager
@@ -66,7 +66,7 @@ func NewEVMChainGERSender(
 	gasOffset uint64,
 	waitPeriodMonitorTx time.Duration,
 ) (*EVMChainGERSender, error) {
-	gerContract, err := pessimisticglobalexitroot.NewPessimisticglobalexitroot(l2GlobalExitRoot, l2Client)
+	gerContract, err := polygonzkevmglobalexitrootv2.NewPolygonzkevmglobalexitrootv2(l2GlobalExitRoot, l2Client)
 	if err != nil {
 		return nil, err
 	}
@@ -83,24 +83,25 @@ func NewEVMChainGERSender(
 }
 
 func (c *EVMChainGERSender) IsGERInjected(ger common.Hash) (bool, error) {
-	timestamp, err := c.gerContract.GlobalExitRootMap(&bind.CallOpts{Pending: false}, ger)
+	blockHashBigInt, err := c.gerContract.GlobalExitRootMap(&bind.CallOpts{Pending: false}, ger)
 	if err != nil {
 		return false, fmt.Errorf("error calling gerContract.GlobalExitRootMap: %w", err)
 	}
 
-	return timestamp.Cmp(common.Big0) != 0, nil
+	return common.BigToHash(blockHashBigInt) != common.Hash{}, nil
 }
 
 func (c *EVMChainGERSender) InjectGER(ctx context.Context, ger common.Hash) error {
 	ticker := time.NewTicker(c.waitPeriodMonitorTx)
 	defer ticker.Stop()
 
-	gerABI, err := pessimisticglobalexitroot.PessimisticglobalexitrootMetaData.GetAbi()
+	gerABI, err := polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2MetaData.GetAbi()
 	if err != nil {
 		return err
 	}
 
-	updateGERTxInput, err := gerABI.Pack("updateGlobalExitRoot", ger)
+	// TODO: @Stefan-Ethernal should we invoke the PolygonZkEVMBridgeV2.updateGlobalExitRoot?
+	updateGERTxInput, err := gerABI.Pack("updateExitRoot", ger)
 	if err != nil {
 		return err
 	}
diff --git a/aggoracle/e2e_test.go b/aggoracle/e2e_test.go
index 090bd57c3..c5cd3c8a0 100644
--- a/aggoracle/e2e_test.go
+++ b/aggoracle/e2e_test.go
@@ -6,7 +6,7 @@ import (
 	"testing"
 	"time"
 
-	gerContractL1 "github.com/0xPolygon/cdk-contracts-tooling/contracts/manual/globalexitrootnopush0"
+	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"
@@ -22,7 +22,7 @@ func TestEVM(t *testing.T) {
 
 func runTest(
 	t *testing.T,
-	gerL1Contract *gerContractL1.Globalexitrootnopush0,
+	gerL1Contract *gerContractL1.Polygonzkevmglobalexitrootv2,
 	sender aggoracle.ChainSender,
 	l1Client *simulated.Backend,
 	authL1 *bind.TransactOpts,
@@ -30,6 +30,8 @@ func runTest(
 	t.Helper()
 
 	for i := 0; i < 10; i++ {
+		// TODO: @Stefan-Ethernal this should be invoked either from rollup manager or bridge
+		// https://github.com/0xPolygonHermez/zkevm-contracts/blob/2b279bbe712e3d396dcafad4be63b663dd647476/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol#L85-L95
 		_, err := gerL1Contract.UpdateExitRoot(authL1, common.HexToHash(strconv.Itoa(i)))
 		require.NoError(t, err)
 		l1Client.Commit()
diff --git a/go.mod b/go.mod
index 367f163a1..6b0482477 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module github.com/0xPolygon/cdk
 go 1.22.4
 
 require (
-	github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20240826154954-f6182d2b17a2
+	github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20241211191239-915ad3f37c3b
 	github.com/0xPolygon/cdk-data-availability v0.0.10
 	github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6
 	github.com/0xPolygon/zkevm-ethtx-manager v0.2.1
diff --git a/go.sum b/go.sum
index ccf812c4c..29fb57330 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,7 @@
 github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20240826154954-f6182d2b17a2 h1:N5qvWG4amhUt6d1F4Kf8AdJZs4z7/xZfE3v/Im2afNM=
 github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20240826154954-f6182d2b17a2/go.mod h1:mFlcEjsm2YBBsu8atHJ3zyVnwM+Z/fMXpVmIJge+WVU=
+github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20241211191239-915ad3f37c3b h1:IvCbb1Pl6W0Ty7GFyq71O0KGOtSg82nqn5zi6UVGivk=
+github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20241211191239-915ad3f37c3b/go.mod h1:mFlcEjsm2YBBsu8atHJ3zyVnwM+Z/fMXpVmIJge+WVU=
 github.com/0xPolygon/cdk-data-availability v0.0.10 h1:pVcke2I7GuPH7JeRLKokEOHffPMwEHmJd9yDXHqh9B4=
 github.com/0xPolygon/cdk-data-availability v0.0.10/go.mod h1:nn5RmnkzOiugAxizSbaYnA+em79YLLLoR25i0UlKc5Q=
 github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 h1:FXL/rcO7/GtZ3kRFw+C7J6vmGnl8gcazg+Gh/NVmnas=
diff --git a/lastgersync/evmdownloader.go b/lastgersync/evmdownloader.go
index bf9a236f2..7a695faa3 100644
--- a/lastgersync/evmdownloader.go
+++ b/lastgersync/evmdownloader.go
@@ -7,7 +7,7 @@ import (
 	"math/big"
 	"time"
 
-	"github.com/0xPolygon/cdk-contracts-tooling/contracts/manual/pessimisticglobalexitroot"
+	"github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain-paris/polygonzkevmglobalexitrootv2"
 	"github.com/0xPolygon/cdk/db"
 	"github.com/0xPolygon/cdk/l1infotreesync"
 	"github.com/0xPolygon/cdk/log"
@@ -27,7 +27,7 @@ type EthClienter interface {
 type downloader struct {
 	*sync.EVMDownloaderImplementation
 	l2Client       EthClienter
-	gerContract    *pessimisticglobalexitroot.Pessimisticglobalexitroot
+	gerContract    *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2
 	l1InfoTreesync *l1infotreesync.L1InfoTreeSync
 	processor      *processor
 	rh             *sync.RetryHandler
@@ -42,7 +42,7 @@ func newDownloader(
 	blockFinality *big.Int,
 	waitForNewBlocksPeriod time.Duration,
 ) (*downloader, error) {
-	gerContract, err := pessimisticglobalexitroot.NewPessimisticglobalexitroot(globalExitRootL2, l2Client)
+	gerContract, err := polygonzkevmglobalexitrootv2.NewPolygonzkevmglobalexitrootv2(globalExitRootL2, l2Client)
 	if err != nil {
 		return nil, err
 	}
diff --git a/test/helpers/e2e.go b/test/helpers/e2e.go
index 6b3b0c861..d77b6e26a 100644
--- a/test/helpers/e2e.go
+++ b/test/helpers/e2e.go
@@ -6,9 +6,8 @@ import (
 	"testing"
 	"time"
 
-	"github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry-paris/polygonzkevmbridgev2"
-	gerContractL1 "github.com/0xPolygon/cdk-contracts-tooling/contracts/manual/globalexitrootnopush0"
-	gerContractEVMChain "github.com/0xPolygon/cdk-contracts-tooling/contracts/manual/pessimisticglobalexitrootnopush0"
+	"github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain-paris/polygonzkevmbridgev2"
+	"github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain-paris/polygonzkevmglobalexitrootv2"
 	"github.com/0xPolygon/cdk/aggoracle"
 	"github.com/0xPolygon/cdk/aggoracle/chaingersender"
 	"github.com/0xPolygon/cdk/bridgesync"
@@ -24,7 +23,7 @@ import (
 )
 
 const (
-	NetworkIDL2        = uint32(1)
+	rollupID           = uint32(1)
 	syncBlockChunkSize = 10
 	retries            = 3
 	periodRetry        = time.Millisecond * 100
@@ -34,9 +33,9 @@ type AggoracleWithEVMChainEnv struct {
 	L1Client         *simulated.Backend
 	L2Client         *simulated.Backend
 	L1InfoTreeSync   *l1infotreesync.L1InfoTreeSync
-	GERL1Contract    *gerContractL1.Globalexitrootnopush0
+	GERL1Contract    *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2
 	GERL1Addr        common.Address
-	GERL2Contract    *gerContractEVMChain.Pessimisticglobalexitrootnopush0
+	GERL2Contract    *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2
 	GERL2Addr        common.Address
 	AuthL1           *bind.TransactOpts
 	AuthL2           *bind.TransactOpts
@@ -101,7 +100,7 @@ func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChainEnv {
 		BridgeL2Addr:     bridgeL2Addr,
 		BridgeL2Sync:     bridgeL2Sync,
 
-		NetworkIDL2:    NetworkIDL2,
+		NetworkIDL2:    rollupID,
 		EthTxManMockL2: ethTxManMockL2,
 	}
 }
@@ -109,7 +108,7 @@ func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChainEnv {
 func CommonSetup(t *testing.T) (
 	*simulated.Backend,
 	*l1infotreesync.L1InfoTreeSync,
-	*gerContractL1.Globalexitrootnopush0,
+	*polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2,
 	common.Address,
 	*polygonzkevmbridgev2.Polygonzkevmbridgev2,
 	common.Address,
@@ -172,7 +171,7 @@ func CommonSetup(t *testing.T) (
 func L2SetupEVM(t *testing.T) (
 	aggoracle.ChainSender,
 	*simulated.Backend,
-	*gerContractEVMChain.Pessimisticglobalexitrootnopush0,
+	*polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2,
 	common.Address,
 	*polygonzkevmbridgev2.Polygonzkevmbridgev2,
 	common.Address,
@@ -227,7 +226,7 @@ func newSimulatedL1(t *testing.T) (
 	*simulated.Backend,
 	*bind.TransactOpts,
 	common.Address,
-	*gerContractL1.Globalexitrootnopush0,
+	*polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2,
 	common.Address,
 	*polygonzkevmbridgev2.Polygonzkevmbridgev2,
 ) {
@@ -237,7 +236,8 @@ func newSimulatedL1(t *testing.T) (
 
 	precalculatedAddr := crypto.CreateAddress(setup.DeployerAuth.From, 2) //nolint:mnd
 
-	gerAddr, _, gerContract, err := gerContractL1.DeployGlobalexitrootnopush0(setup.DeployerAuth, client.Client(),
+	gerAddr, _, gerContract, err := polygonzkevmglobalexitrootv2.DeployPolygonzkevmglobalexitrootv2(
+		setup.DeployerAuth, client.Client(),
 		setup.UserAuth.From, setup.BridgeProxyAddr)
 	require.NoError(t, err)
 	client.Commit()
@@ -251,30 +251,31 @@ func newSimulatedEVMAggSovereignChain(t *testing.T) (
 	*simulated.Backend,
 	*bind.TransactOpts,
 	common.Address,
-	*gerContractEVMChain.Pessimisticglobalexitrootnopush0,
+	*polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2,
 	common.Address,
 	*polygonzkevmbridgev2.Polygonzkevmbridgev2,
 ) {
 	t.Helper()
 
-	client, setup := SimulatedBackend(t, nil, NetworkIDL2)
+	client, setup := SimulatedBackend(t, nil, rollupID)
 
-	precalculatedAddr := crypto.CreateAddress(setup.DeployerAuth.From, 2) //nolint:mnd
-
-	gerAddr, _, gerContract, err := gerContractEVMChain.DeployPessimisticglobalexitrootnopush0(
-		setup.DeployerAuth, client.Client(), setup.UserAuth.From,
-	)
+	// TODO: @Stefan-Ethernal deploy the GlobalExitRootManagerL2SovereignChain here instead?
+	// https://github.com/0xPolygonHermez/zkevm-contracts/blob/feature/audit-remediations/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol
+	gerAddr, _, gerContract, err := polygonzkevmglobalexitrootv2.DeployPolygonzkevmglobalexitrootv2(
+		setup.DeployerAuth, client.Client(), setup.UserAuth.From, setup.BridgeProxyAddr)
 	require.NoError(t, err)
 	client.Commit()
 
-	globalExitRootSetterRole := common.HexToHash("0x7b95520991dfda409891be0afa2635b63540f92ee996fda0bf695a166e5c5176")
-	_, err = gerContract.GrantRole(setup.DeployerAuth, globalExitRootSetterRole, setup.UserAuth.From)
-	require.NoError(t, err)
-	client.Commit()
+	// TODO: @Stefan-Ethernal Remove?
+	// globalExitRootSetterRole := common.HexToHash("0x7b95520991dfda409891be0afa2635b63540f92ee996fda0bf695a166e5c5176")
+	// _, err = gerContract.GrantRole(setup.DeployerAuth, globalExitRootSetterRole, setup.UserAuth.From)
+	// require.NoError(t, err)
+	// client.Commit()
 
-	hasRole, _ := gerContract.HasRole(&bind.CallOpts{Pending: false}, globalExitRootSetterRole, setup.UserAuth.From)
-	require.True(t, hasRole)
-	require.Equal(t, precalculatedAddr, gerAddr)
+	// precalculatedAddr := crypto.CreateAddress(setup.DeployerAuth.From, 2) //nolint:mnd
+	// hasRole, _ := gerContract.HasRole(&bind.CallOpts{Pending: false}, globalExitRootSetterRole, setup.UserAuth.From)
+	// require.True(t, hasRole)
+	// require.Equal(t, precalculatedAddr, gerAddr)
 
 	return client, setup.UserAuth, gerAddr, gerContract, setup.BridgeProxyAddr, setup.BridgeProxyContract
 }
diff --git a/test/helpers/simulated.go b/test/helpers/simulated.go
index 08f013943..31d609d16 100644
--- a/test/helpers/simulated.go
+++ b/test/helpers/simulated.go
@@ -4,7 +4,7 @@ import (
 	"math/big"
 	"testing"
 
-	"github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry-paris/polygonzkevmbridgev2"
+	"github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain-paris/polygonzkevmbridgev2"
 	"github.com/0xPolygon/cdk/test/contracts/transparentupgradableproxy"
 	"github.com/ethereum/go-ethereum/accounts/abi/bind"
 	"github.com/ethereum/go-ethereum/common"
@@ -35,8 +35,6 @@ func (tc TestClient) Client() *rpc.Client {
 type SimulatedBackendSetup struct {
 	UserAuth            *bind.TransactOpts
 	DeployerAuth        *bind.TransactOpts
-	BridgeAddr          common.Address
-	BridgeContract      *polygonzkevmbridgev2.Polygonzkevmbridgev2
 	BridgeProxyAddr     common.Address
 	BridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2
 }
@@ -45,7 +43,7 @@ type SimulatedBackendSetup struct {
 func SimulatedBackend(
 	t *testing.T,
 	balances map[common.Address]types.Account,
-	ebZkevmBridgeNetwork uint32,
+	rollupID uint32,
 ) (*simulated.Backend, *SimulatedBackendSetup) {
 	t.Helper()
 
@@ -81,13 +79,16 @@ func SimulatedBackend(
 
 	// MUST BE DEPLOYED FIRST
 	// Deploy zkevm bridge contract
-	bridgeAddr, _, bridgeContract, err := polygonzkevmbridgev2.DeployPolygonzkevmbridgev2(deployerAuth, client.Client())
+	bridgeAddr, _, _, err := polygonzkevmbridgev2.DeployPolygonzkevmbridgev2(deployerAuth, client.Client())
 	require.NoError(t, err)
 	client.Commit()
 
 	// Create proxy contract for the bridge
-	var bridgeProxyAddr common.Address
-	var bridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2
+	var (
+		bridgeProxyAddr     common.Address
+		bridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2
+	)
+
 	{
 		precalculatedAddr := crypto.CreateAddress(deployerAuth.From, 2) //nolint:mnd
 
@@ -96,7 +97,7 @@ func SimulatedBackend(
 		require.NotNil(t, bridgeABI)
 
 		dataCallProxy, err := bridgeABI.Pack("initialize",
-			ebZkevmBridgeNetwork,
+			rollupID,
 			common.Address{}, // gasTokenAddressMainnet
 			uint32(0),        // gasTokenNetworkMainnet
 			precalculatedAddr,
@@ -127,8 +128,6 @@ func SimulatedBackend(
 	return client, &SimulatedBackendSetup{
 		UserAuth:            userAuth,
 		DeployerAuth:        deployerAuth,
-		BridgeAddr:          bridgeAddr,
-		BridgeContract:      bridgeContract,
 		BridgeProxyAddr:     bridgeProxyAddr,
 		BridgeProxyContract: bridgeProxyContract,
 	}