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 }