github.com/leovct/zkevm-bridge-service@v0.4.4/etherman/etherman.go (about)

     1  package etherman
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"math/big"
     8  	"time"
     9  
    10  	"github.com/0xPolygonHermez/zkevm-bridge-service/log"
    11  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/oldpolygonzkevmbridge"
    12  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonrollupmanager"
    13  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge"
    14  	"github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot"
    15  	"github.com/ethereum/go-ethereum"
    16  	"github.com/ethereum/go-ethereum/accounts/abi/bind"
    17  	"github.com/ethereum/go-ethereum/common"
    18  	"github.com/ethereum/go-ethereum/core/types"
    19  	"github.com/ethereum/go-ethereum/crypto"
    20  	"github.com/ethereum/go-ethereum/ethclient"
    21  	"golang.org/x/crypto/sha3"
    22  )
    23  
    24  var (
    25  	// New Ger event
    26  	updateL1InfoTreeSignatureHash = crypto.Keccak256Hash([]byte("UpdateL1InfoTree(bytes32,bytes32)"))
    27  
    28  	// New Bridge events
    29  	depositEventSignatureHash         = crypto.Keccak256Hash([]byte("BridgeEvent(uint8,uint32,address,uint32,address,uint256,bytes,uint32)")) // Used in oldBridge as well
    30  	claimEventSignatureHash           = crypto.Keccak256Hash([]byte("ClaimEvent(uint256,uint32,address,address,uint256)"))
    31  	newWrappedTokenEventSignatureHash = crypto.Keccak256Hash([]byte("NewWrappedToken(uint32,address,address,bytes)")) // Used in oldBridge as well
    32  
    33  	// Old Bridge events
    34  	oldClaimEventSignatureHash = crypto.Keccak256Hash([]byte("ClaimEvent(uint32,uint32,address,address,uint256)"))
    35  
    36  	// Proxy events
    37  	initializedProxySignatureHash = crypto.Keccak256Hash([]byte("Initialized(uint8)"))
    38  	adminChangedSignatureHash     = crypto.Keccak256Hash([]byte("AdminChanged(address,address)"))
    39  	beaconUpgradedSignatureHash   = crypto.Keccak256Hash([]byte("BeaconUpgraded(address)"))
    40  	upgradedSignatureHash         = crypto.Keccak256Hash([]byte("Upgraded(address)"))
    41  
    42  	// Events RollupManager
    43  	setBatchFeeSignatureHash                       = crypto.Keccak256Hash([]byte("SetBatchFee(uint256)"))
    44  	setTrustedAggregatorSignatureHash              = crypto.Keccak256Hash([]byte("SetTrustedAggregator(address)"))       // Used in oldZkEvm as well
    45  	setVerifyBatchTimeTargetSignatureHash          = crypto.Keccak256Hash([]byte("SetVerifyBatchTimeTarget(uint64)"))    // Used in oldZkEvm as well
    46  	setMultiplierBatchFeeSignatureHash             = crypto.Keccak256Hash([]byte("SetMultiplierBatchFee(uint16)"))       // Used in oldZkEvm as well
    47  	setPendingStateTimeoutSignatureHash            = crypto.Keccak256Hash([]byte("SetPendingStateTimeout(uint64)"))      // Used in oldZkEvm as well
    48  	setTrustedAggregatorTimeoutSignatureHash       = crypto.Keccak256Hash([]byte("SetTrustedAggregatorTimeout(uint64)")) // Used in oldZkEvm as well
    49  	overridePendingStateSignatureHash              = crypto.Keccak256Hash([]byte("OverridePendingState(uint32,uint64,bytes32,bytes32,address)"))
    50  	proveNonDeterministicPendingStateSignatureHash = crypto.Keccak256Hash([]byte("ProveNonDeterministicPendingState(bytes32,bytes32)")) // Used in oldZkEvm as well
    51  	consolidatePendingStateSignatureHash           = crypto.Keccak256Hash([]byte("ConsolidatePendingState(uint32,uint64,bytes32,bytes32,uint64)"))
    52  	verifyBatchesTrustedAggregatorSignatureHash    = crypto.Keccak256Hash([]byte("VerifyBatchesTrustedAggregator(uint32,uint64,bytes32,bytes32,address)"))
    53  	rollupManagerVerifyBatchesSignatureHash        = crypto.Keccak256Hash([]byte("VerifyBatches(uint32,uint64,bytes32,bytes32,address)"))
    54  	onSequenceBatchesSignatureHash                 = crypto.Keccak256Hash([]byte("OnSequenceBatches(uint32,uint64)"))
    55  	updateRollupSignatureHash                      = crypto.Keccak256Hash([]byte("UpdateRollup(uint32,uint32,uint64)"))
    56  	addExistingRollupSignatureHash                 = crypto.Keccak256Hash([]byte("AddExistingRollup(uint32,uint64,address,uint64,uint8,uint64)"))
    57  	createNewRollupSignatureHash                   = crypto.Keccak256Hash([]byte("CreateNewRollup(uint32,uint32,address,uint64,address)"))
    58  	obsoleteRollupTypeSignatureHash                = crypto.Keccak256Hash([]byte("ObsoleteRollupType(uint32)"))
    59  	addNewRollupTypeSignatureHash                  = crypto.Keccak256Hash([]byte("AddNewRollupType(uint32,address,address,uint64,uint8,bytes32,string)"))
    60  
    61  	// Extra RollupManager
    62  	initializedSignatureHash               = crypto.Keccak256Hash([]byte("Initialized(uint64)"))                       // Initializable. Used in RollupBase as well
    63  	roleAdminChangedSignatureHash          = crypto.Keccak256Hash([]byte("RoleAdminChanged(bytes32,bytes32,bytes32)")) // IAccessControlUpgradeable
    64  	roleGrantedSignatureHash               = crypto.Keccak256Hash([]byte("RoleGranted(bytes32,address,address)"))      // IAccessControlUpgradeable
    65  	roleRevokedSignatureHash               = crypto.Keccak256Hash([]byte("RoleRevoked(bytes32,address,address)"))      // IAccessControlUpgradeable
    66  	emergencyStateActivatedSignatureHash   = crypto.Keccak256Hash([]byte("EmergencyStateActivated()"))                 // EmergencyManager. Used in oldZkEvm as well
    67  	emergencyStateDeactivatedSignatureHash = crypto.Keccak256Hash([]byte("EmergencyStateDeactivated()"))               // EmergencyManager. Used in oldZkEvm as well
    68  
    69  	// PreLxLy events
    70  	updateGlobalExitRootSignatureHash              = crypto.Keccak256Hash([]byte("UpdateGlobalExitRoot(bytes32,bytes32)"))
    71  	oldVerifyBatchesTrustedAggregatorSignatureHash = crypto.Keccak256Hash([]byte("VerifyBatchesTrustedAggregator(uint64,bytes32,address)"))
    72  	transferOwnershipSignatureHash                 = crypto.Keccak256Hash([]byte("OwnershipTransferred(address,address)"))
    73  	updateZkEVMVersionSignatureHash                = crypto.Keccak256Hash([]byte("UpdateZkEVMVersion(uint64,uint64,string)"))
    74  	oldConsolidatePendingStateSignatureHash        = crypto.Keccak256Hash([]byte("ConsolidatePendingState(uint64,bytes32,uint64)"))
    75  	oldOverridePendingStateSignatureHash           = crypto.Keccak256Hash([]byte("OverridePendingState(uint64,bytes32,address)"))
    76  	sequenceBatchesPreEtrogSignatureHash           = crypto.Keccak256Hash([]byte("SequenceBatches(uint64)"))
    77  
    78  	setForceBatchTimeoutSignatureHash   = crypto.Keccak256Hash([]byte("SetForceBatchTimeout(uint64)"))             // Used in oldZkEvm as well
    79  	setTrustedSequencerURLSignatureHash = crypto.Keccak256Hash([]byte("SetTrustedSequencerURL(string)"))           // Used in oldZkEvm as well
    80  	setTrustedSequencerSignatureHash    = crypto.Keccak256Hash([]byte("SetTrustedSequencer(address)"))             // Used in oldZkEvm as well
    81  	verifyBatchesSignatureHash          = crypto.Keccak256Hash([]byte("VerifyBatches(uint64,bytes32,address)"))    // Used in oldZkEvm as well
    82  	sequenceForceBatchesSignatureHash   = crypto.Keccak256Hash([]byte("SequenceForceBatches(uint64)"))             // Used in oldZkEvm as well
    83  	forceBatchSignatureHash             = crypto.Keccak256Hash([]byte("ForceBatch(uint64,bytes32,address,bytes)")) // Used in oldZkEvm as well
    84  	sequenceBatchesSignatureHash        = crypto.Keccak256Hash([]byte("SequenceBatches(uint64,bytes32)"))          // Used in oldZkEvm as well
    85  	acceptAdminRoleSignatureHash        = crypto.Keccak256Hash([]byte("AcceptAdminRole(address)"))                 // Used in oldZkEvm as well
    86  	transferAdminRoleSignatureHash      = crypto.Keccak256Hash([]byte("TransferAdminRole(address)"))               // Used in oldZkEvm as well
    87  
    88  	// ErrNotFound is used when the object is not found
    89  	ErrNotFound = errors.New("Not found")
    90  )
    91  
    92  // EventOrder is the the type used to identify the events order
    93  type EventOrder string
    94  
    95  const (
    96  	// GlobalExitRootsOrder identifies a GlobalExitRoot event
    97  	GlobalExitRootsOrder EventOrder = "GlobalExitRoot"
    98  	// DepositsOrder identifies a Deposits event
    99  	DepositsOrder EventOrder = "Deposit"
   100  	// ClaimsOrder identifies a Claims event
   101  	ClaimsOrder EventOrder = "Claim"
   102  	// TokensOrder identifies a TokenWrapped event
   103  	TokensOrder EventOrder = "TokenWrapped"
   104  	// VerifyBatchOrder identifies a VerifyBatch event
   105  	VerifyBatchOrder EventOrder = "VerifyBatch"
   106  	// ActivateEtrogOrder identifies the event to activate etrog
   107  	ActivateEtrogOrder EventOrder = "etrog"
   108  )
   109  
   110  type ethClienter interface {
   111  	ethereum.ChainReader
   112  	ethereum.LogFilterer
   113  	ethereum.TransactionReader
   114  }
   115  
   116  // Client is a simple implementation of EtherMan.
   117  type Client struct {
   118  	EtherClient                ethClienter
   119  	PolygonBridge              *polygonzkevmbridge.Polygonzkevmbridge
   120  	OldPolygonBridge           *oldpolygonzkevmbridge.Oldpolygonzkevmbridge
   121  	PolygonZkEVMGlobalExitRoot *polygonzkevmglobalexitroot.Polygonzkevmglobalexitroot
   122  	PolygonRollupManager       *polygonrollupmanager.Polygonrollupmanager
   123  	RollupID                   uint32
   124  	SCAddresses                []common.Address
   125  }
   126  
   127  // NewClient creates a new etherman.
   128  func NewClient(cfg Config, polygonBridgeAddr, polygonZkEVMGlobalExitRootAddress, polygonRollupManagerAddress, polygonZkEvmAddress common.Address) (*Client, error) {
   129  	// Connect to ethereum node
   130  	ethClient, err := ethclient.Dial(cfg.L1URL)
   131  	if err != nil {
   132  		log.Errorf("error connecting to %s: %+v", cfg.L1URL, err)
   133  		return nil, err
   134  	}
   135  	// Create smc clients
   136  	polygonBridge, err := polygonzkevmbridge.NewPolygonzkevmbridge(polygonBridgeAddr, ethClient)
   137  	if err != nil {
   138  		return nil, err
   139  	}
   140  	oldpolygonBridge, err := oldpolygonzkevmbridge.NewOldpolygonzkevmbridge(polygonBridgeAddr, ethClient)
   141  	if err != nil {
   142  		return nil, err
   143  	}
   144  	polygonZkEVMGlobalExitRoot, err := polygonzkevmglobalexitroot.NewPolygonzkevmglobalexitroot(polygonZkEVMGlobalExitRootAddress, ethClient)
   145  	if err != nil {
   146  		return nil, err
   147  	}
   148  	polygonRollupManager, err := polygonrollupmanager.NewPolygonrollupmanager(polygonRollupManagerAddress, ethClient)
   149  	if err != nil {
   150  		return nil, err
   151  	}
   152  	// Get RollupID
   153  	rollupID, err := polygonRollupManager.RollupAddressToID(&bind.CallOpts{Pending: false}, polygonZkEvmAddress)
   154  	if err != nil {
   155  		return nil, err
   156  	}
   157  	log.Debug("rollupID: ", rollupID)
   158  	var scAddresses []common.Address
   159  	scAddresses = append(scAddresses, polygonZkEVMGlobalExitRootAddress, polygonBridgeAddr, polygonRollupManagerAddress)
   160  
   161  	return &Client{
   162  		EtherClient:                ethClient,
   163  		PolygonBridge:              polygonBridge,
   164  		OldPolygonBridge:           oldpolygonBridge,
   165  		PolygonZkEVMGlobalExitRoot: polygonZkEVMGlobalExitRoot,
   166  		PolygonRollupManager:       polygonRollupManager,
   167  		RollupID:                   rollupID,
   168  		SCAddresses:                scAddresses}, nil
   169  }
   170  
   171  // NewL2Client creates a new etherman for L2.
   172  func NewL2Client(url string, polygonBridgeAddr common.Address) (*Client, error) {
   173  	// Connect to ethereum node
   174  	ethClient, err := ethclient.Dial(url)
   175  	if err != nil {
   176  		log.Errorf("error connecting to %s: %+v", url, err)
   177  		return nil, err
   178  	}
   179  	// Create smc clients
   180  	bridge, err := polygonzkevmbridge.NewPolygonzkevmbridge(polygonBridgeAddr, ethClient)
   181  	if err != nil {
   182  		return nil, err
   183  	}
   184  	oldpolygonBridge, err := oldpolygonzkevmbridge.NewOldpolygonzkevmbridge(polygonBridgeAddr, ethClient)
   185  	if err != nil {
   186  		return nil, err
   187  	}
   188  	scAddresses := []common.Address{polygonBridgeAddr}
   189  
   190  	return &Client{EtherClient: ethClient, PolygonBridge: bridge, OldPolygonBridge: oldpolygonBridge, SCAddresses: scAddresses}, nil
   191  }
   192  
   193  // GetRollupInfoByBlockRange function retrieves the Rollup information that are included in all this ethereum blocks
   194  // from block x to block y.
   195  func (etherMan *Client) GetRollupInfoByBlockRange(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]Block, map[common.Hash][]Order, error) {
   196  	// Filter query
   197  	query := ethereum.FilterQuery{
   198  		FromBlock: new(big.Int).SetUint64(fromBlock),
   199  		Addresses: etherMan.SCAddresses,
   200  	}
   201  	if toBlock != nil {
   202  		query.ToBlock = new(big.Int).SetUint64(*toBlock)
   203  	}
   204  	blocks, blocksOrder, err := etherMan.readEvents(ctx, query)
   205  	if err != nil {
   206  		return nil, nil, err
   207  	}
   208  	return blocks, blocksOrder, nil
   209  }
   210  
   211  // Order contains the event order to let the synchronizer store the information following this order.
   212  type Order struct {
   213  	Name EventOrder
   214  	Pos  int
   215  }
   216  
   217  func (etherMan *Client) readEvents(ctx context.Context, query ethereum.FilterQuery) ([]Block, map[common.Hash][]Order, error) {
   218  	logs, err := etherMan.EtherClient.FilterLogs(ctx, query)
   219  	if err != nil {
   220  		return nil, nil, err
   221  	}
   222  	var blocks []Block
   223  	blocksOrder := make(map[common.Hash][]Order)
   224  	for _, vLog := range logs {
   225  		err := etherMan.processEvent(ctx, vLog, &blocks, &blocksOrder)
   226  		if err != nil {
   227  			log.Warnf("error processing event. Retrying... Error: %s. vLog: %+v", err.Error(), vLog)
   228  			return nil, nil, err
   229  		}
   230  	}
   231  	return blocks, blocksOrder, nil
   232  }
   233  
   234  func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   235  	switch vLog.Topics[0] {
   236  	case updateGlobalExitRootSignatureHash:
   237  		return etherMan.updateGlobalExitRootEvent(ctx, vLog, blocks, blocksOrder)
   238  	case updateL1InfoTreeSignatureHash:
   239  		return etherMan.updateL1InfoTreeEvent(ctx, vLog, blocks, blocksOrder)
   240  	case depositEventSignatureHash:
   241  		return etherMan.depositEvent(ctx, vLog, blocks, blocksOrder)
   242  	case claimEventSignatureHash:
   243  		return etherMan.newClaimEvent(ctx, vLog, blocks, blocksOrder)
   244  	case oldClaimEventSignatureHash:
   245  		return etherMan.oldClaimEvent(ctx, vLog, blocks, blocksOrder)
   246  	case newWrappedTokenEventSignatureHash:
   247  		return etherMan.tokenWrappedEvent(ctx, vLog, blocks, blocksOrder)
   248  	case initializedProxySignatureHash:
   249  		log.Debug("Initialized proxy event detected. Ignoring...")
   250  		return nil
   251  	case adminChangedSignatureHash:
   252  		log.Debug("AdminChanged event detected. Ignoring...")
   253  		return nil
   254  	case beaconUpgradedSignatureHash:
   255  		log.Debug("BeaconUpgraded event detected. Ignoring...")
   256  		return nil
   257  	case upgradedSignatureHash:
   258  		log.Debug("Upgraded event detected. Ignoring...")
   259  		return nil
   260  	case transferOwnershipSignatureHash:
   261  		log.Debug("TransferOwnership event detected. Ignoring...")
   262  		return nil
   263  	case setBatchFeeSignatureHash:
   264  		log.Debug("SetBatchFee event detected. Ignoring...")
   265  		return nil
   266  	case setTrustedAggregatorSignatureHash:
   267  		log.Debug("SetTrustedAggregator event detected. Ignoring...")
   268  		return nil
   269  	case setVerifyBatchTimeTargetSignatureHash:
   270  		log.Debug("SetVerifyBatchTimeTarget event detected. Ignoring...")
   271  		return nil
   272  	case setMultiplierBatchFeeSignatureHash:
   273  		log.Debug("SetMultiplierBatchFee event detected. Ignoring...")
   274  		return nil
   275  	case setPendingStateTimeoutSignatureHash:
   276  		log.Debug("SetPendingStateTimeout event detected. Ignoring...")
   277  		return nil
   278  	case setTrustedAggregatorTimeoutSignatureHash:
   279  		log.Debug("SetTrustedAggregatorTimeout event detected. Ignoring...")
   280  		return nil
   281  	case overridePendingStateSignatureHash:
   282  		log.Debug("OverridePendingState event detected. Ignoring...")
   283  		return nil
   284  	case proveNonDeterministicPendingStateSignatureHash:
   285  		log.Debug("ProveNonDeterministicPendingState event detected. Ignoring...")
   286  		return nil
   287  	case consolidatePendingStateSignatureHash:
   288  		log.Debug("ConsolidatePendingState event detected. Ignoring...")
   289  		return nil
   290  	case verifyBatchesTrustedAggregatorSignatureHash:
   291  		return etherMan.verifyBatchesTrustedAggregatorEvent(ctx, vLog, blocks, blocksOrder)
   292  	case rollupManagerVerifyBatchesSignatureHash:
   293  		return etherMan.verifyBatchesEvent(ctx, vLog, blocks, blocksOrder)
   294  	case onSequenceBatchesSignatureHash:
   295  		log.Debug("OnSequenceBatches event detected. Ignoring...")
   296  		return nil
   297  	case updateRollupSignatureHash:
   298  		log.Debug("UpdateRollup event detected. Ignoring...")
   299  		return nil
   300  	case addExistingRollupSignatureHash:
   301  		return etherMan.AddExistingRollupEvent(ctx, vLog, blocks, blocksOrder)
   302  	case createNewRollupSignatureHash:
   303  		return etherMan.createNewRollupEvent(ctx, vLog, blocks, blocksOrder)
   304  	case obsoleteRollupTypeSignatureHash:
   305  		log.Debug("ObsoleteRollupType event detected. Ignoring...")
   306  		return nil
   307  	case addNewRollupTypeSignatureHash:
   308  		log.Debug("AddNewRollupType event detected. Ignoring...")
   309  		return nil
   310  	case initializedSignatureHash:
   311  		log.Debug("Initialized event detected. Ignoring...")
   312  		return nil
   313  	case roleAdminChangedSignatureHash:
   314  		log.Debug("RoleAdminChanged event detected. Ignoring...")
   315  		return nil
   316  	case roleGrantedSignatureHash:
   317  		log.Debug("RoleGranted event detected. Ignoring...")
   318  		return nil
   319  	case roleRevokedSignatureHash:
   320  		log.Debug("RoleRevoked event detected. Ignoring...")
   321  		return nil
   322  	case emergencyStateActivatedSignatureHash:
   323  		log.Debug("EmergencyStateActivated event detected. Ignoring...")
   324  		return nil
   325  	case emergencyStateDeactivatedSignatureHash:
   326  		log.Debug("EmergencyStateDeactivated event detected. Ignoring...")
   327  		return nil
   328  	case oldVerifyBatchesTrustedAggregatorSignatureHash:
   329  		log.Debug("OldVerifyBatchesTrustedAggregator event detected. Ignoring...")
   330  		return nil
   331  	case updateZkEVMVersionSignatureHash:
   332  		log.Debug("UpdateZkEVMVersion event detected. Ignoring...")
   333  		return nil
   334  	case oldConsolidatePendingStateSignatureHash:
   335  		log.Debug("OldConsolidatePendingState event detected. Ignoring...")
   336  		return nil
   337  	case oldOverridePendingStateSignatureHash:
   338  		log.Debug("OldOverridePendingState event detected. Ignoring...")
   339  		return nil
   340  	case sequenceBatchesPreEtrogSignatureHash:
   341  		log.Debug("SequenceBatchesPreEtrog event detected. Ignoring...")
   342  		return nil
   343  	case setForceBatchTimeoutSignatureHash:
   344  		log.Debug("SetForceBatchTimeout event detected. Ignoring...")
   345  		return nil
   346  	case setTrustedSequencerURLSignatureHash:
   347  		log.Debug("SetTrustedSequencerURL event detected. Ignoring...")
   348  		return nil
   349  	case setTrustedSequencerSignatureHash:
   350  		log.Debug("SetTrustedSequencer event detected. Ignoring...")
   351  		return nil
   352  	case verifyBatchesSignatureHash:
   353  		log.Debug("VerifyBatches event detected. Ignoring...")
   354  		return nil
   355  	case sequenceForceBatchesSignatureHash:
   356  		log.Debug("SequenceForceBatches event detected. Ignoring...")
   357  		return nil
   358  	case forceBatchSignatureHash:
   359  		log.Debug("ForceBatch event detected. Ignoring...")
   360  		return nil
   361  	case sequenceBatchesSignatureHash:
   362  		log.Debug("SequenceBatches event detected. Ignoring...")
   363  		return nil
   364  	case acceptAdminRoleSignatureHash:
   365  		log.Debug("AcceptAdminRole event detected. Ignoring...")
   366  		return nil
   367  	case transferAdminRoleSignatureHash:
   368  		log.Debug("TransferAdminRole event detected. Ignoring...")
   369  		return nil
   370  	}
   371  	log.Warnf("Event not registered: %+v", vLog)
   372  	return nil
   373  }
   374  
   375  func (etherMan *Client) updateGlobalExitRootEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   376  	log.Debug("UpdateGlobalExitRoot event detected. Processing...")
   377  	return etherMan.processUpdateGlobalExitRootEvent(ctx, vLog.Topics[1], vLog.Topics[2], vLog, blocks, blocksOrder)
   378  }
   379  
   380  func (etherMan *Client) updateL1InfoTreeEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   381  	log.Debug("UpdateL1InfoTree event detected")
   382  	globalExitRoot, err := etherMan.PolygonZkEVMGlobalExitRoot.ParseUpdateL1InfoTree(vLog)
   383  	if err != nil {
   384  		return err
   385  	}
   386  	return etherMan.processUpdateGlobalExitRootEvent(ctx, globalExitRoot.MainnetExitRoot, globalExitRoot.RollupExitRoot, vLog, blocks, blocksOrder)
   387  }
   388  
   389  func (etherMan *Client) processUpdateGlobalExitRootEvent(ctx context.Context, mainnetExitRoot, rollupExitRoot common.Hash, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   390  	fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   391  	if err != nil {
   392  		return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   393  	}
   394  	var gExitRoot GlobalExitRoot
   395  	gExitRoot.ExitRoots = make([]common.Hash, 0)
   396  	gExitRoot.ExitRoots = append(gExitRoot.ExitRoots, mainnetExitRoot)
   397  	gExitRoot.ExitRoots = append(gExitRoot.ExitRoots, rollupExitRoot)
   398  	gExitRoot.GlobalExitRoot = hash(mainnetExitRoot, rollupExitRoot)
   399  	gExitRoot.BlockNumber = vLog.BlockNumber
   400  
   401  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   402  		t := time.Unix(int64(fullBlock.Time()), 0)
   403  		block := prepareBlock(vLog, t, fullBlock)
   404  		block.GlobalExitRoots = append(block.GlobalExitRoots, gExitRoot)
   405  		*blocks = append(*blocks, block)
   406  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   407  		(*blocks)[len(*blocks)-1].GlobalExitRoots = append((*blocks)[len(*blocks)-1].GlobalExitRoots, gExitRoot)
   408  	} else {
   409  		log.Error("Error processing UpdateGlobalExitRoot event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   410  		return fmt.Errorf("error processing UpdateGlobalExitRoot event")
   411  	}
   412  	or := Order{
   413  		Name: GlobalExitRootsOrder,
   414  		Pos:  len((*blocks)[len(*blocks)-1].GlobalExitRoots) - 1,
   415  	}
   416  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   417  	return nil
   418  }
   419  
   420  func (etherMan *Client) depositEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   421  	log.Debug("Deposit event detected. Processing...")
   422  	d, err := etherMan.PolygonBridge.ParseBridgeEvent(vLog)
   423  	if err != nil {
   424  		return err
   425  	}
   426  	var deposit Deposit
   427  	deposit.Amount = d.Amount
   428  	deposit.BlockNumber = vLog.BlockNumber
   429  	deposit.OriginalNetwork = uint(d.OriginNetwork)
   430  	deposit.DestinationAddress = d.DestinationAddress
   431  	deposit.DestinationNetwork = uint(d.DestinationNetwork)
   432  	deposit.OriginalAddress = d.OriginAddress
   433  	deposit.DepositCount = uint(d.DepositCount)
   434  	deposit.TxHash = vLog.TxHash
   435  	deposit.Metadata = d.Metadata
   436  	deposit.LeafType = d.LeafType
   437  
   438  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   439  		fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   440  		if err != nil {
   441  			return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   442  		}
   443  		block := prepareBlock(vLog, time.Unix(int64(fullBlock.Time()), 0), fullBlock)
   444  		block.Deposits = append(block.Deposits, deposit)
   445  		*blocks = append(*blocks, block)
   446  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   447  		(*blocks)[len(*blocks)-1].Deposits = append((*blocks)[len(*blocks)-1].Deposits, deposit)
   448  	} else {
   449  		log.Error("Error processing deposit event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   450  		return fmt.Errorf("error processing Deposit event")
   451  	}
   452  	or := Order{
   453  		Name: DepositsOrder,
   454  		Pos:  len((*blocks)[len(*blocks)-1].Deposits) - 1,
   455  	}
   456  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   457  	return nil
   458  }
   459  
   460  func (etherMan *Client) oldClaimEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   461  	log.Debug("Old claim event detected. Processing...")
   462  	c, err := etherMan.OldPolygonBridge.ParseClaimEvent(vLog)
   463  	if err != nil {
   464  		return err
   465  	}
   466  	return etherMan.claimEvent(ctx, vLog, blocks, blocksOrder, c.Amount, c.DestinationAddress, c.OriginAddress, uint(c.Index), uint(c.OriginNetwork), 0, false)
   467  }
   468  
   469  func (etherMan *Client) newClaimEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   470  	log.Debug("New claim event detected. Processing...")
   471  	c, err := etherMan.PolygonBridge.ParseClaimEvent(vLog)
   472  	if err != nil {
   473  		return err
   474  	}
   475  	mainnetFlag, rollupIndex, localExitRootIndex, err := decodeGlobalIndex(c.GlobalIndex)
   476  	if err != nil {
   477  		return err
   478  	}
   479  	return etherMan.claimEvent(ctx, vLog, blocks, blocksOrder, c.Amount, c.DestinationAddress, c.OriginAddress, uint(localExitRootIndex), uint(c.OriginNetwork), rollupIndex, mainnetFlag)
   480  }
   481  
   482  func (etherMan *Client) claimEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order, amount *big.Int, destinationAddress, originAddress common.Address, Index uint, originNetwork uint, rollupIndex uint64, mainnetFlag bool) error {
   483  	var claim Claim
   484  	claim.Amount = amount
   485  	claim.DestinationAddress = destinationAddress
   486  	claim.Index = Index
   487  	claim.OriginalNetwork = originNetwork
   488  	claim.OriginalAddress = originAddress
   489  	claim.BlockNumber = vLog.BlockNumber
   490  	claim.TxHash = vLog.TxHash
   491  	claim.RollupIndex = rollupIndex
   492  	claim.MainnetFlag = mainnetFlag
   493  
   494  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   495  		fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   496  		if err != nil {
   497  			return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   498  		}
   499  		block := prepareBlock(vLog, time.Unix(int64(fullBlock.Time()), 0), fullBlock)
   500  		block.Claims = append(block.Claims, claim)
   501  		*blocks = append(*blocks, block)
   502  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   503  		(*blocks)[len(*blocks)-1].Claims = append((*blocks)[len(*blocks)-1].Claims, claim)
   504  	} else {
   505  		log.Error("Error processing claim event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   506  		return fmt.Errorf("error processing claim event")
   507  	}
   508  	or := Order{
   509  		Name: ClaimsOrder,
   510  		Pos:  len((*blocks)[len(*blocks)-1].Claims) - 1,
   511  	}
   512  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   513  	return nil
   514  }
   515  
   516  func (etherMan *Client) tokenWrappedEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   517  	log.Debug("TokenWrapped event detected. Processing...")
   518  	tw, err := etherMan.PolygonBridge.ParseNewWrappedToken(vLog)
   519  	if err != nil {
   520  		return err
   521  	}
   522  	var tokenWrapped TokenWrapped
   523  	tokenWrapped.OriginalNetwork = uint(tw.OriginNetwork)
   524  	tokenWrapped.OriginalTokenAddress = tw.OriginTokenAddress
   525  	tokenWrapped.WrappedTokenAddress = tw.WrappedTokenAddress
   526  	tokenWrapped.BlockNumber = vLog.BlockNumber
   527  
   528  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   529  		fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   530  		if err != nil {
   531  			return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   532  		}
   533  		block := prepareBlock(vLog, time.Unix(int64(fullBlock.Time()), 0), fullBlock)
   534  		block.Tokens = append(block.Tokens, tokenWrapped)
   535  		*blocks = append(*blocks, block)
   536  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   537  		(*blocks)[len(*blocks)-1].Tokens = append((*blocks)[len(*blocks)-1].Tokens, tokenWrapped)
   538  	} else {
   539  		log.Error("Error processing TokenWrapped event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   540  		return fmt.Errorf("error processing TokenWrapped event")
   541  	}
   542  	or := Order{
   543  		Name: TokensOrder,
   544  		Pos:  len((*blocks)[len(*blocks)-1].Tokens) - 1,
   545  	}
   546  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   547  	return nil
   548  }
   549  
   550  func prepareBlock(vLog types.Log, t time.Time, fullBlock *types.Block) Block {
   551  	var block Block
   552  	block.BlockNumber = vLog.BlockNumber
   553  	block.BlockHash = vLog.BlockHash
   554  	block.ParentHash = fullBlock.ParentHash()
   555  	block.ReceivedAt = t
   556  	return block
   557  }
   558  
   559  func hash(data ...[32]byte) [32]byte {
   560  	var res [32]byte
   561  	hash := sha3.NewLegacyKeccak256()
   562  	for _, d := range data {
   563  		hash.Write(d[:]) //nolint:errcheck,gosec
   564  	}
   565  	copy(res[:], hash.Sum(nil))
   566  	return res
   567  }
   568  
   569  // HeaderByNumber returns a block header from the current canonical chain. If number is
   570  // nil, the latest known header is returned.
   571  func (etherMan *Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) {
   572  	return etherMan.EtherClient.HeaderByNumber(ctx, number)
   573  }
   574  
   575  // EthBlockByNumber function retrieves the ethereum block information by ethereum block number.
   576  func (etherMan *Client) EthBlockByNumber(ctx context.Context, blockNumber uint64) (*types.Block, error) {
   577  	block, err := etherMan.EtherClient.BlockByNumber(ctx, new(big.Int).SetUint64(blockNumber))
   578  	if err != nil {
   579  		if errors.Is(err, ethereum.NotFound) || err.Error() == "block does not exist in blockchain" {
   580  			return nil, ErrNotFound
   581  		}
   582  		return nil, err
   583  	}
   584  	return block, nil
   585  }
   586  
   587  // GetNetworkID gets the network ID of the dedicated chain.
   588  func (etherMan *Client) GetNetworkID(ctx context.Context) (uint, error) {
   589  	networkID, err := etherMan.PolygonBridge.NetworkID(&bind.CallOpts{Pending: false})
   590  	if err != nil {
   591  		return 0, err
   592  	}
   593  	return uint(networkID), nil
   594  }
   595  
   596  func (etherMan *Client) verifyBatchesTrustedAggregatorEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   597  	log.Debug("VerifyBatchesTrustedAggregator event detected. Processing...")
   598  	vb, err := etherMan.PolygonRollupManager.ParseVerifyBatchesTrustedAggregator(vLog)
   599  	if err != nil {
   600  		log.Error("error parsing verifyBatchesTrustedAggregator event. Error: ", err)
   601  		return err
   602  	}
   603  	return etherMan.verifyBatches(ctx, vLog, blocks, blocksOrder, uint(vb.RollupID), vb.NumBatch, vb.StateRoot, vb.ExitRoot, vb.Aggregator)
   604  }
   605  
   606  func (etherMan *Client) verifyBatchesEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   607  	log.Debug("RollupManagerVerifyBatches event detected. Processing...")
   608  	vb, err := etherMan.PolygonRollupManager.ParseVerifyBatches(vLog)
   609  	if err != nil {
   610  		log.Error("error parsing VerifyBatches event. Error: ", err)
   611  		return err
   612  	}
   613  	return etherMan.verifyBatches(ctx, vLog, blocks, blocksOrder, uint(vb.RollupID), vb.NumBatch, vb.StateRoot, vb.ExitRoot, vb.Aggregator)
   614  }
   615  
   616  func (etherMan *Client) verifyBatches(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order, rollupID uint, batchNum uint64, stateRoot, localExitRoot common.Hash, aggregator common.Address) error {
   617  	var verifyBatch VerifiedBatch
   618  	verifyBatch.BlockNumber = vLog.BlockNumber
   619  	verifyBatch.BatchNumber = batchNum
   620  	verifyBatch.RollupID = rollupID
   621  	verifyBatch.LocalExitRoot = localExitRoot
   622  	verifyBatch.TxHash = vLog.TxHash
   623  	verifyBatch.StateRoot = stateRoot
   624  	verifyBatch.Aggregator = aggregator
   625  
   626  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   627  		fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   628  		if err != nil {
   629  			return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   630  		}
   631  		block := prepareBlock(vLog, time.Unix(int64(fullBlock.Time()), 0), fullBlock)
   632  		block.VerifiedBatches = append(block.VerifiedBatches, verifyBatch)
   633  		*blocks = append(*blocks, block)
   634  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   635  		(*blocks)[len(*blocks)-1].VerifiedBatches = append((*blocks)[len(*blocks)-1].VerifiedBatches, verifyBatch)
   636  	} else {
   637  		log.Error("Error processing verifyBatch event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   638  		return fmt.Errorf("error processing verifyBatch event")
   639  	}
   640  	or := Order{
   641  		Name: VerifyBatchOrder,
   642  		Pos:  len((*blocks)[len(*blocks)-1].VerifiedBatches) - 1,
   643  	}
   644  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   645  	return nil
   646  }
   647  
   648  func (etherMan *Client) GetRollupID() uint {
   649  	return uint(etherMan.RollupID)
   650  }
   651  
   652  func decodeGlobalIndex(globalIndex *big.Int) (bool, uint64, uint64, error) {
   653  	const lengthGlobalIndexInBytes = 32
   654  	var buf [32]byte
   655  	gIBytes := globalIndex.FillBytes(buf[:])
   656  	if len(gIBytes) != lengthGlobalIndexInBytes {
   657  		return false, 0, 0, fmt.Errorf("invalid globaIndex length. Should be 32. Current length: %d", len(gIBytes))
   658  	}
   659  	mainnetFlag := big.NewInt(0).SetBytes([]byte{gIBytes[23]}).Uint64() == 1
   660  	rollupIndex := big.NewInt(0).SetBytes(gIBytes[24:28])
   661  	localRootIndex := big.NewInt(0).SetBytes(gIBytes[29:32])
   662  	return mainnetFlag, rollupIndex.Uint64(), localRootIndex.Uint64(), nil
   663  }
   664  
   665  func GenerateGlobalIndex(mainnetFlag bool, rollupIndex uint, localExitRootIndex uint) *big.Int {
   666  	var (
   667  		globalIndexBytes []byte
   668  		buf              [4]byte
   669  	)
   670  	if mainnetFlag {
   671  		globalIndexBytes = append(globalIndexBytes, big.NewInt(1).Bytes()...)
   672  		ri := big.NewInt(0).FillBytes(buf[:])
   673  		globalIndexBytes = append(globalIndexBytes, ri...)
   674  	} else {
   675  		ri := big.NewInt(0).SetUint64(uint64(rollupIndex)).FillBytes(buf[:])
   676  		globalIndexBytes = append(globalIndexBytes, ri...)
   677  	}
   678  	leri := big.NewInt(0).SetUint64(uint64(localExitRootIndex)).FillBytes(buf[:])
   679  	globalIndexBytes = append(globalIndexBytes, leri...)
   680  	return big.NewInt(0).SetBytes(globalIndexBytes)
   681  }
   682  
   683  func (etherMan *Client) createNewRollupEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   684  	log.Debug("CreateNewRollup event detected. Processing...")
   685  	rollup, err := etherMan.PolygonRollupManager.ParseCreateNewRollup(vLog)
   686  	if err != nil {
   687  		return err
   688  	}
   689  	if rollup.RollupID != etherMan.RollupID {
   690  		return nil
   691  	}
   692  
   693  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   694  		fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   695  		if err != nil {
   696  			return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   697  		}
   698  		block := prepareBlock(vLog, time.Unix(int64(fullBlock.Time()), 0), fullBlock)
   699  		block.ActivateEtrog = append(block.ActivateEtrog, true)
   700  		*blocks = append(*blocks, block)
   701  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   702  		(*blocks)[len(*blocks)-1].ActivateEtrog = append((*blocks)[len(*blocks)-1].ActivateEtrog, true)
   703  	} else {
   704  		log.Error("Error processing TokenWrapped event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   705  		return fmt.Errorf("error processing TokenWrapped event")
   706  	}
   707  	or := Order{
   708  		Name: ActivateEtrogOrder,
   709  		Pos:  len((*blocks)[len(*blocks)-1].ActivateEtrog) - 1,
   710  	}
   711  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   712  	return nil
   713  }
   714  
   715  func (etherMan *Client) AddExistingRollupEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error {
   716  	log.Debug("AddExistingRollup event detected. Processing...")
   717  	rollup, err := etherMan.PolygonRollupManager.ParseAddExistingRollup(vLog)
   718  	if err != nil {
   719  		return err
   720  	}
   721  	if rollup.RollupID != etherMan.RollupID {
   722  		return nil
   723  	}
   724  
   725  	if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) {
   726  		fullBlock, err := etherMan.EtherClient.BlockByHash(ctx, vLog.BlockHash)
   727  		if err != nil {
   728  			return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err)
   729  		}
   730  		block := prepareBlock(vLog, time.Unix(int64(fullBlock.Time()), 0), fullBlock)
   731  		block.ActivateEtrog = append(block.ActivateEtrog, true)
   732  		*blocks = append(*blocks, block)
   733  	} else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber {
   734  		(*blocks)[len(*blocks)-1].ActivateEtrog = append((*blocks)[len(*blocks)-1].ActivateEtrog, true)
   735  	} else {
   736  		log.Error("Error processing TokenWrapped event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber)
   737  		return fmt.Errorf("error processing TokenWrapped event")
   738  	}
   739  	or := Order{
   740  		Name: ActivateEtrogOrder,
   741  		Pos:  len((*blocks)[len(*blocks)-1].ActivateEtrog) - 1,
   742  	}
   743  	(*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or)
   744  	return nil
   745  }