From 6dd530a56348ba035e1de02269558aa4481c6ec2 Mon Sep 17 00:00:00 2001 From: Alonso Rodriguez Date: Thu, 16 Jan 2025 10:18:17 +0100 Subject: [PATCH] Feature/#725 remove ger sovereign chain (#730) * remove EthBlockByNumber * db migration 15 * implemented * linter * fix synchronizer unit test * disable readyforclaim flag for deposits * remove ger e2e * v9.0.0-rc.4-pp contracts * local bridge contract * linter * fix e2e --- Makefile | 2 +- autoclaimservice/blockchainmanager/manager.go | 8 +- db/pgstorage/migrations/0015.sql | 19 + db/pgstorage/migrations/0015_test.go | 94 + db/pgstorage/pgstorage.go | 91 +- etherman/etherman.go | 77 +- etherman/etherman_test.go | 6 +- etherman/simulated.go | 8 +- .../abi/bridgel2sovereignchain.abi | 82 +- .../globalexitrootmanagerl2sovereignchain.abi | 75 + .../abi/polygonzkevmbridgev2.abi | 1004 +++++++++ .../bin/bridgel2sovereignchain.bin | 2 +- .../globalexitrootmanagerl2sovereignchain.bin | 2 +- .../bin/polygonzkevmbridgev2.bin | 1 + .../bridgel2sovereignchain.go | 199 +- .../globalexitrootmanagerl2sovereignchain.go | 389 +++- .../polygonzkevmbridgev2.go | 1935 +++++++++++++++++ etherman/smartcontracts/script.sh | 1 + etherman/types.go | 1 + server/interfaces.go | 2 +- server/mock_bridgeServiceStorage.go | 22 +- server/service.go | 4 +- server/service_test.go | 2 +- synchronizer/interfaces.go | 4 +- synchronizer/mock_etherman.go | 59 - synchronizer/mock_storage.go | 70 +- synchronizer/synchronizer.go | 32 +- synchronizer/synchronizer_test.go | 86 +- test/e2e/bridge_sovereign_chain_test.go | 28 + test/operations/manager.go | 51 +- test/scripts/deploytool/main.go | 2 +- utils/client.go | 12 +- 32 files changed, 4083 insertions(+), 287 deletions(-) create mode 100644 db/pgstorage/migrations/0015.sql create mode 100644 db/pgstorage/migrations/0015_test.go create mode 100644 etherman/smartcontracts/abi/polygonzkevmbridgev2.abi create mode 100644 etherman/smartcontracts/bin/polygonzkevmbridgev2.bin create mode 100644 etherman/smartcontracts/polygonzkevmbridgev2/polygonzkevmbridgev2.go diff --git a/Makefile b/Makefile index 4b5c1d3c..ce50887b 100644 --- a/Makefile +++ b/Makefile @@ -479,7 +479,7 @@ test-e2ecompress: build-docker stop run-multi-single-bridge ## Runs all tests ch trap '$(STOP)' EXIT; MallocNanoZone=0 go test -v -failfast -race -p 1 -timeout 2400s ./test/e2e/... -count 1 -tags='e2ecompress' .PHONY: test-sovereignchain -test-sovereignchain: build-docker stop run-multi-single-bridge ## Runs all tests checking race conditions +test-sovereignchain: build-docker stop run-sovereign-chain ## Runs all tests checking race conditions sleep 3 trap '$(STOP)' EXIT; MallocNanoZone=0 go test -v -failfast -race -p 1 -timeout 2400s ./test/e2e/... -count 1 -tags='sovereignchain' diff --git a/autoclaimservice/blockchainmanager/manager.go b/autoclaimservice/blockchainmanager/manager.go index a27175c5..0cb911eb 100644 --- a/autoclaimservice/blockchainmanager/manager.go +++ b/autoclaimservice/blockchainmanager/manager.go @@ -8,9 +8,9 @@ import ( "path/filepath" "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/claimcompressor" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/polygonzkevmbridgev2" "github.com/0xPolygonHermez/zkevm-bridge-service/log" zkevmtypes "github.com/0xPolygonHermez/zkevm-node/config/types" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" @@ -31,7 +31,7 @@ const ( // Client is a simple implementation of EtherMan. type Client struct { EtherClient *ethclient.Client - PolygonBridge *polygonzkevmbridge.Polygonzkevmbridge + PolygonBridge *polygonzkevmbridgev2.Polygonzkevmbridgev2 ClaimCompressor *claimcompressor.Claimcompressor NetworkID uint32 cfg *Config @@ -49,7 +49,7 @@ func NewClient(ctx context.Context, cfg *Config) (*Client, error) { return nil, err } // Create smc clients - bridge, err := polygonzkevmbridge.NewPolygonzkevmbridge(cfg.PolygonBridgeAddress, ethClient) + bridge, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(cfg.PolygonBridgeAddress, ethClient) if err != nil { return nil, err } @@ -143,7 +143,7 @@ func (bm *Client) SendClaim(leafType, origNet uint32, if leafType == LeafTypeAsset { tx, err = bm.PolygonBridge.ClaimAsset(bm.auth, smtProof, smtRollupProof, globalIndex, mainnetExitRoot, rollupExitRoot, origNet, origAddr, destNet, destAddr, amount, metadata) if err != nil { - a, _ := polygonzkevmbridge.PolygonzkevmbridgeMetaData.GetAbi() + a, _ := polygonzkevmbridgev2.Polygonzkevmbridgev2MetaData.GetAbi() input, err3 := a.Pack("claimAsset", smtProof, smtRollupProof, globalIndex, mainnetExitRoot, rollupExitRoot, origNet, origAddr, destNet, destAddr, amount, metadata) if err3 != nil { bm.logger.Error("error packing call. Error: ", err3) diff --git a/db/pgstorage/migrations/0015.sql b/db/pgstorage/migrations/0015.sql new file mode 100644 index 00000000..af9eb808 --- /dev/null +++ b/db/pgstorage/migrations/0015.sql @@ -0,0 +1,19 @@ +-- +migrate Up + +CREATE TABLE IF NOT EXISTS sync.remove_exit_root( + id BIGSERIAL, + block_id BIGINT REFERENCES sync.block (id) ON DELETE CASCADE, + global_exit_root BYTEA, + network_id BIGINT, + PRIMARY KEY (id) +); + +ALTER TABLE sync.exit_root ADD COLUMN IF NOT EXISTS allowed BOOLEAN NOT NULL DEFAULT true; + + + +-- +migrate Down + +DROP TABLE IF EXISTS sync.remove_exit_root; + +ALTER TABLE sync.exit_root DROP COLUMN IF EXISTS allowed; diff --git a/db/pgstorage/migrations/0015_test.go b/db/pgstorage/migrations/0015_test.go new file mode 100644 index 00000000..d7075f73 --- /dev/null +++ b/db/pgstorage/migrations/0015_test.go @@ -0,0 +1,94 @@ +package migrations_test + +import ( + "database/sql" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/lib/pq" + "github.com/stretchr/testify/assert" +) + +type migrationTest0015 struct{} + +func (m migrationTest0015) InsertData(db *sql.DB) error { + block := "INSERT INTO sync.block (id, block_num, block_hash, parent_hash, network_id, received_at) VALUES(69, 2803824, decode('27474F16174BBE50C294FE13C190B92E42B2368A6D4AEB8A4A015F52816296C3','hex'), decode('C9B5033799ADF3739383A0489EFBE8A0D4D5E4478778A4F4304562FD51AE4C07','hex'), 0, '0001-01-01 01:00:00.000');" + if _, err := db.Exec(block); err != nil { + return err + } + block2 := "INSERT INTO sync.block (id, block_num, block_hash, parent_hash, network_id, received_at) VALUES(70, 2803824, decode('27474F16174BBE50C294FE13C190B92E42B2368A6D4AEB8A4A015F52816296C4','hex'), decode('C9B5033799ADF3739383A0489EFBE8A0D4D5E4478778A4F4304562FD51AE4C08','hex'), 1, '0001-01-01 01:00:00.000');" + if _, err := db.Exec(block2); err != nil { + return err + } + const gerSQL = ` + INSERT INTO sync.exit_root + (id, block_id, global_exit_root, exit_roots, network_id) + VALUES(1, 69, decode('717E05DE47A87A7D1679E183F1C224150675F6302B7DA4EAAB526B2B91AE0761','hex'), '{decode(''5C7830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030'',''hex''),decode(''5C7832376165356261303864373239316339366338636264646363313438626634386136643638633739373462393433353666353337353465663631373164373537'',''hex'')}', 0); + INSERT INTO sync.exit_root + (id, block_id, global_exit_root, exit_roots, network_id) + VALUES(2, 70, decode('717E05DE47A87A7D1679E183F1C224150675F6302B7DA4EAAB526B2B91AE0761','hex'), '{decode(''5C7830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030'',''hex''),decode(''5C7832376165356261303864373239316339366338636264646363313438626634386136643638633739373462393433353666353337353465663631373164373537'',''hex'')}', 1); + ` + if _, err := db.Exec(gerSQL); err != nil { + return err + } + return nil +} + +func (m migrationTest0015) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) { + selectGER := `SELECT allowed FROM sync.exit_root limit 1;` + var allowed bool + err := db.QueryRow(selectGER).Scan(&allowed) + assert.NoError(t, err) + + const gerSQL = ` + INSERT INTO sync.exit_root + (id, block_id, global_exit_root, exit_roots, network_id, allowed) + VALUES(3, 69, decode('26C7509B1B6E04162FD30850A046A59A725F31FBF2CA43C0A7A015D667F3CFFD','hex'), '{decode(''5C7835626130303233323962353363313161326631646665393062313165303331373731383432303536636632313235623433646138313033633139396463643766'',''hex''),decode(''5C7832376165356261303864373239316339366338636264646363313438626634386136643638633739373462393433353666353337353465663631373164373537'',''hex'')}', 0, true); + INSERT INTO sync.exit_root + (id, block_id, global_exit_root, exit_roots, network_id, allowed) + VALUES(4, 70, decode('26C7509B1B6E04162FD30850A046A59A725F31FBF2CA43C0A7A015D667F3CFFD','hex'), '{decode(''5C7835626130303233323962353363313161326631646665393062313165303331373731383432303536636632313235623433646138313033633139396463643766'',''hex''),decode(''5C7832376165356261303864373239316339366338636264646363313438626634386136643638633739373462393433353666353337353465663631373164373537'',''hex'')}', 1, false);` + _, err = db.Exec(gerSQL) + assert.NoError(t, err) + + selectGER = `SELECT allowed FROM sync.exit_root where id = 1;` + err = db.QueryRow(selectGER).Scan(&allowed) + assert.NoError(t, err) + assert.Equal(t, true, allowed) + + selectGER = `SELECT allowed FROM sync.exit_root where id = 3;` + err = db.QueryRow(selectGER).Scan(&allowed) + assert.NoError(t, err) + assert.Equal(t, true, allowed) + + selectGER = `SELECT allowed FROM sync.exit_root where id = 4;` + err = db.QueryRow(selectGER).Scan(&allowed) + assert.NoError(t, err) + assert.Equal(t, false, allowed) +} + +func (m migrationTest0015) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) { + var ( + id uint64 + blockID uint64 + globalExitRoot common.Hash + exitRoots [][]byte + networkID uint32 + allowed bool + ) + selectGER := `SELECT allowed FROM sync.exit_root limit 1;` + err := db.QueryRow(selectGER).Scan(&allowed) + assert.Error(t, err) + + selectGER = `SELECT id, block_id, global_exit_root, exit_roots, network_id FROM sync.exit_root where id = 4;` + err = db.QueryRow(selectGER).Scan(&id, &blockID, &globalExitRoot, pq.Array(&exitRoots), &networkID) + assert.NoError(t, err) + assert.Equal(t, uint64(4), id) + assert.Equal(t, uint64(70), blockID) + assert.Equal(t, common.HexToHash("0x26c7509b1b6e04162fd30850a046a59a725f31fbf2ca43c0a7a015d667f3cffd"), globalExitRoot) + assert.NotEqual(t, 0, len(exitRoots)) + assert.Equal(t, uint32(1), networkID) +} + +func TestMigration0015(t *testing.T) { + runMigrationTest(t, 15, migrationTest0015{}) +} diff --git a/db/pgstorage/pgstorage.go b/db/pgstorage/pgstorage.go index fc2b9bf6..4498ab10 100644 --- a/db/pgstorage/pgstorage.go +++ b/db/pgstorage/pgstorage.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "math" "math/big" "strings" "time" @@ -104,7 +105,7 @@ func (p *PostgresStorage) AddBlock(ctx context.Context, block *etherman.Block, d // AddGlobalExitRoot adds a new ExitRoot to the db. func (p *PostgresStorage) AddGlobalExitRoot(ctx context.Context, exitRoot *etherman.GlobalExitRoot, dbTx pgx.Tx) error { - const addExitRootSQL = "INSERT INTO sync.exit_root (block_id, global_exit_root, exit_roots, network_id) VALUES ($1, $2, $3, $4)" + const addExitRootSQL = "INSERT INTO sync.exit_root (block_id, global_exit_root, exit_roots, network_id, allowed) VALUES ($1, $2, $3, $4, true)" exitRoots := [][]byte{} if len(exitRoot.ExitRoots) != 0 { exitRoots = [][]byte{exitRoot.ExitRoots[0][:], exitRoot.ExitRoots[1][:]} @@ -195,8 +196,8 @@ func (p *PostgresStorage) GetNumberDeposits(ctx context.Context, networkID uint3 // AddTrustedGlobalExitRoot adds new global exit root which comes from the trusted sequencer. func (p *PostgresStorage) AddTrustedGlobalExitRoot(ctx context.Context, trustedExitRoot *etherman.GlobalExitRoot, dbTx pgx.Tx) (bool, error) { const addTrustedGerSQL = ` - INSERT INTO sync.exit_root (block_id, global_exit_root, exit_roots, network_id) - VALUES (0, $1, $2, $3) + INSERT INTO sync.exit_root (block_id, global_exit_root, exit_roots, network_id, allowed) + VALUES (0, $1, $2, $3, true) ON CONFLICT ON CONSTRAINT UC DO NOTHING;` res, err := p.getExecQuerier(dbTx).Exec(ctx, addTrustedGerSQL, trustedExitRoot.GlobalExitRoot, pq.Array([][]byte{trustedExitRoot.ExitRoots[0][:], trustedExitRoot.ExitRoots[1][:]}), trustedExitRoot.NetworkID) return res.RowsAffected() > 0, err @@ -273,7 +274,7 @@ func (p *PostgresStorage) GetLatestL1SyncedExitRoot(ctx context.Context, dbTx pg ger etherman.GlobalExitRoot exitRoots [][]byte ) - const getLatestL1SyncedExitRootSQL = "SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root WHERE block_id > 0 AND network_id = 0 ORDER BY id DESC LIMIT 1" + const getLatestL1SyncedExitRootSQL = "SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root WHERE allowed = true AND block_id > 0 AND network_id = 0 ORDER BY id DESC LIMIT 1" err := p.getExecQuerier(dbTx).QueryRow(ctx, getLatestL1SyncedExitRootSQL).Scan(&ger.BlockID, &ger.GlobalExitRoot, pq.Array(&exitRoots)) if err != nil { if errors.Is(err, pgx.ErrNoRows) { @@ -285,13 +286,13 @@ func (p *PostgresStorage) GetLatestL1SyncedExitRoot(ctx context.Context, dbTx pg return &ger, nil } -// GetExitRootByGER gets the latest L1 synced global exit root. -func (p *PostgresStorage) GetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) { +// GetL1ExitRootByGER gets the latest L1 synced global exit root. +func (p *PostgresStorage) GetL1ExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) { var ( gerData etherman.GlobalExitRoot exitRoots [][]byte ) - const getSyncedExitRootSQL = "SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root WHERE block_id > 0 AND global_exit_root = $1 AND network_id = 0 ORDER BY id DESC LIMIT 1" + const getSyncedExitRootSQL = "SELECT block_id, global_exit_root, exit_roots FROM sync.exit_root WHERE allowed = true AND block_id > 0 AND global_exit_root = $1 AND network_id = 0 ORDER BY id DESC LIMIT 1" err := p.getExecQuerier(dbTx).QueryRow(ctx, getSyncedExitRootSQL, ger).Scan(&gerData.BlockID, &gerData.GlobalExitRoot, pq.Array(&exitRoots)) if err != nil { if errors.Is(err, pgx.ErrNoRows) { @@ -303,9 +304,9 @@ func (p *PostgresStorage) GetExitRootByGER(ctx context.Context, ger common.Hash, return &gerData, nil } -// GetL2ExitRootsByGER gets the global exit roots in al the L2 networks. +// GetL2ExitRootsByGER gets the global exit roots in all the L2 networks. func (p *PostgresStorage) GetL2ExitRootsByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) ([]etherman.GlobalExitRoot, error) { - const getL2ExitRootsByGERSQL = "SELECT block_id, global_exit_root, network_id, id FROM sync.exit_root WHERE block_id > 0 AND global_exit_root = $1 AND network_id != 0 AND cardinality(exit_roots) = 0 ORDER BY id DESC" + const getL2ExitRootsByGERSQL = "SELECT block_id, global_exit_root, network_id, id FROM sync.exit_root WHERE allowed = true AND block_id > 0 AND global_exit_root = $1 AND network_id != 0 AND cardinality(exit_roots) = 0 ORDER BY id DESC" rows, err := p.getExecQuerier(dbTx).Query(ctx, getL2ExitRootsByGERSQL, ger) if err != nil { if errors.Is(err, pgx.ErrNoRows) { @@ -343,8 +344,8 @@ func (p *PostgresStorage) GetLatestTrustedExitRoot(ctx context.Context, networkI ger etherman.GlobalExitRoot exitRoots [][]byte ) - const getLatestTrustedExitRootSQL = "SELECT global_exit_root, exit_roots FROM sync.exit_root WHERE network_id = $1 ORDER BY id DESC LIMIT 1" - err := p.getExecQuerier(dbTx).QueryRow(ctx, getLatestTrustedExitRootSQL, networkID).Scan(&ger.GlobalExitRoot, pq.Array(&exitRoots)) + const getLatestTrustedExitRootSQL = "SELECT global_exit_root, exit_roots, block_id, network_id, id FROM sync.exit_root WHERE network_id = $1 AND allowed = true ORDER BY id DESC LIMIT 1" + err := p.getExecQuerier(dbTx).QueryRow(ctx, getLatestTrustedExitRootSQL, networkID).Scan(&ger.GlobalExitRoot, pq.Array(&exitRoots), &ger.BlockID, &ger.NetworkID, &ger.ID) if err != nil { if errors.Is(err, pgx.ErrNoRows) { return nil, gerror.ErrStorageNotFound @@ -355,7 +356,7 @@ func (p *PostgresStorage) GetLatestTrustedExitRoot(ctx context.Context, networkI ger.ExitRoots = []common.Hash{common.BytesToHash(exitRoots[0]), common.BytesToHash(exitRoots[1])} } else { // Query to look for the missing values - l1GER, err := p.GetExitRootByGER(ctx, ger.GlobalExitRoot, dbTx) + l1GER, err := p.GetL1ExitRootByGER(ctx, ger.GlobalExitRoot, dbTx) if err != nil { if errors.Is(err, pgx.ErrNoRows) { log.Error("Missing L1Ger for the L2Ger entry") @@ -649,7 +650,7 @@ func (p *PostgresStorage) GetDepositsFromOtherL2ToClaim(ctx context.Context, des // GetLatestTrustedGERByDeposit return the latest trusted ger for an specific deposit func (p *PostgresStorage) GetLatestTrustedGERByDeposit(ctx context.Context, depositCnt, networkID, destinationNetwork uint32, dbTx pgx.Tx) (common.Hash, error) { - const getLatestTrustedGERByDeposit = `SELECT sync.exit_root.global_exit_root FROM sync.deposit inner join mt.root on mt.root.deposit_id = sync.deposit.id inner join mt.rollup_exit on mt.rollup_exit.leaf = mt.root.root inner join sync.exit_root on sync.exit_root.exit_roots[2]= mt.rollup_exit.root where deposit_cnt = $1 and sync.deposit.network_id = $2 and dest_net = $3 and mt.rollup_exit.rollup_id = $2 and sync.exit_root.network_id = sync.deposit.dest_net order by sync.exit_root.id desc limit 1` + const getLatestTrustedGERByDeposit = `SELECT sync.exit_root.global_exit_root FROM sync.deposit inner join mt.root on mt.root.deposit_id = sync.deposit.id inner join mt.rollup_exit on mt.rollup_exit.leaf = mt.root.root inner join sync.exit_root on sync.exit_root.exit_roots[2]= mt.rollup_exit.root where sync.exit_root.allowed = true and deposit_cnt = $1 and sync.deposit.network_id = $2 and dest_net = $3 and mt.rollup_exit.rollup_id = $2 and sync.exit_root.network_id = sync.deposit.dest_net order by sync.exit_root.id desc limit 1` var ger common.Hash err := p.getExecQuerier(dbTx).QueryRow(ctx, getLatestTrustedGERByDeposit, depositCnt, networkID, destinationNetwork).Scan(&ger) if errors.Is(err, pgx.ErrNoRows) { @@ -745,6 +746,70 @@ func (p *PostgresStorage) GetPendingDepositsToClaim(ctx context.Context, destAdd return deposits, totalCount, nil } +func (p *PostgresStorage) AddRemoveL2GER(ctx context.Context, globalExitRoot etherman.GlobalExitRoot, dbTx pgx.Tx) error { + const insertRemoveGERSQL = `INSERT INTO sync.remove_exit_root + (block_id, global_exit_root, network_id) + VALUES ($1, $2, $3)` + _, err := p.getExecQuerier(dbTx).Exec(ctx, insertRemoveGERSQL, globalExitRoot.BlockID, globalExitRoot.GlobalExitRoot, globalExitRoot.NetworkID) + if err != nil { + return err + } + + // Modify the allowed column in the exit_root table for this globalExitRoot + const updateGERStatusSQL = "UPDATE sync.exit_root SET allowed = false WHERE global_exit_root = $1 AND network_id = $2 RETURNING id;" + var gerID uint64 + err = p.getExecQuerier(dbTx).QueryRow(ctx, updateGERStatusSQL, globalExitRoot.GlobalExitRoot, globalExitRoot.NetworkID).Scan(&gerID) + if err != nil { + return err + } + + // Look for the deposits where the ready for claim flag needs to be modified + getPreviousGERSQL := "SELECT global_exit_root FROM sync.exit_root WHERE network_id = $1 AND id < $2 ORDER BY id DESC LIMIT 1" + var prevGer common.Hash + err = p.getExecQuerier(dbTx).QueryRow(ctx, getPreviousGERSQL, globalExitRoot.NetworkID, gerID).Scan(&prevGer) + if err != nil { + return err + } + prevDepositID, _, err := p.GetDepositCountByGER(ctx, prevGer, globalExitRoot.NetworkID, false, dbTx) + if errors.Is(err, gerror.ErrStorageNotFound) { + log.Warnf("No previous deposit found using this prevGER: %s in L1, NetworkID: %d, currentGER: %s", prevGer.String(), globalExitRoot.NetworkID, globalExitRoot.GlobalExitRoot.String()) + prevDepositID = 0 + } else if err != nil { + return err + } + CurrentDepositID, _, err := p.GetDepositCountByGER(ctx, globalExitRoot.GlobalExitRoot, globalExitRoot.NetworkID, false, dbTx) + if errors.Is(err, gerror.ErrStorageNotFound) { + log.Warnf("No deposit found for this GER: %s in L1, NetworkID: %d", globalExitRoot.GlobalExitRoot.String(), globalExitRoot.NetworkID) + CurrentDepositID = math.MaxUint64 + } else if err != nil { + return err + } + // Disable the ready for claim flag for this deposits + const updateDepositsFlagSQL = `UPDATE sync.deposit SET ready_for_claim = false WHERE id > $1 AND id <= $2 AND network_id = 0 AND dest_net = $3` + _, err = p.getExecQuerier(dbTx).Exec(ctx, updateDepositsFlagSQL, prevDepositID, CurrentDepositID, globalExitRoot.NetworkID) + return err +} + +// GetDepositCountByGER gets the deposit count by the GER. +func (p *PostgresStorage) GetDepositCountByGER(ctx context.Context, ger common.Hash, network uint32, rollupsTree bool, dbTx pgx.Tx) (uint64, uint32, error) { + var ( + depositID uint64 + depositCnt, rootNetwork uint32 + ) + arrayIndex := 1 + if rollupsTree { + arrayIndex = 2 + rootNetwork = network + } + + const getDepositCountByGERSQL = "SELECT sync.deposit.id, sync.deposit.deposit_cnt FROM sync.deposit INNER JOIN mt.root ON sync.deposit.id = mt.root.deposit_id inner join sync.exit_root on mt.root.root = sync.exit_root.exit_roots[$1] WHERE sync.exit_root.global_exit_root = $2 and sync.exit_root.network_id = $3 AND mt.root.network = $4" + err := p.getExecQuerier(dbTx).QueryRow(ctx, getDepositCountByGERSQL, arrayIndex, ger, network, rootNetwork).Scan(&depositID, &depositCnt) + if errors.Is(err, pgx.ErrNoRows) { + return 0, 0, gerror.ErrStorageNotFound + } + return depositID, depositCnt, err +} + // UpdateDepositsStatusForTesting updates the ready_for_claim status of all deposits for testing. func (p *PostgresStorage) UpdateDepositsStatusForTesting(ctx context.Context, dbTx pgx.Tx) error { const updateDepositsStatusSQL = "UPDATE sync.deposit SET ready_for_claim = true;" diff --git a/etherman/etherman.go b/etherman/etherman.go index 55d444b4..09fe6fdc 100644 --- a/etherman/etherman.go +++ b/etherman/etherman.go @@ -10,10 +10,10 @@ import ( "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/claimcompressor" "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/globalexitrootmanagerl2sovereignchain" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/polygonzkevmbridgev2" "github.com/0xPolygonHermez/zkevm-bridge-service/log" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/oldpolygonzkevmbridge" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonrollupmanager" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -107,8 +107,10 @@ var ( type EventOrder string const ( - // GlobalExitRootsOrder identifies a GlobalExitRoot event + // GlobalExitRootsOrder identifies a GlobalExitRoot event and insertGlobalExitRoot event GlobalExitRootsOrder EventOrder = "GlobalExitRoot" + // RemoveL2GEROrder identifies the removeLastGlobalExitRoot event + RemoveL2GEROrder EventOrder = "RemoveL2GEROrder" // DepositsOrder identifies a Deposits event DepositsOrder EventOrder = "Deposit" // ClaimsOrder identifies a Claims event @@ -128,7 +130,7 @@ type ethClienter interface { // Client is a simple implementation of EtherMan. type Client struct { EtherClient ethClienter - PolygonBridge *polygonzkevmbridge.Polygonzkevmbridge + PolygonBridgeV2 *polygonzkevmbridgev2.Polygonzkevmbridgev2 OldPolygonBridge *oldpolygonzkevmbridge.Oldpolygonzkevmbridge PolygonZkEVMGlobalExitRoot *polygonzkevmglobalexitroot.Polygonzkevmglobalexitroot PolygonRollupManager *polygonrollupmanager.Polygonrollupmanager @@ -149,7 +151,7 @@ func NewClient(cfg Config, polygonBridgeAddr, polygonZkEVMGlobalExitRootAddress, return nil, err } // Create smc clients - polygonBridge, err := polygonzkevmbridge.NewPolygonzkevmbridge(polygonBridgeAddr, ethClient) + polygonBridgeV2, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(polygonBridgeAddr, ethClient) if err != nil { return nil, err } @@ -172,7 +174,7 @@ func NewClient(cfg Config, polygonBridgeAddr, polygonZkEVMGlobalExitRootAddress, return &Client{ logger: logger, EtherClient: ethClient, - PolygonBridge: polygonBridge, + PolygonBridgeV2: polygonBridgeV2, OldPolygonBridge: oldpolygonBridge, PolygonZkEVMGlobalExitRoot: polygonZkEVMGlobalExitRoot, PolygonRollupManager: polygonRollupManager, @@ -188,7 +190,7 @@ func NewL2Client(url string, polygonBridgeAddress, claimCompressorAddress, polyg return nil, err } // Create smc clients - bridge, err := polygonzkevmbridge.NewPolygonzkevmbridge(polygonBridgeAddress, ethClient) + bridge, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(polygonBridgeAddress, ethClient) if err != nil { return nil, err } @@ -225,7 +227,7 @@ func NewL2Client(url string, polygonBridgeAddress, claimCompressorAddress, polyg return &Client{ logger: logger, EtherClient: ethClient, - PolygonBridge: bridge, + PolygonBridgeV2: bridge, OldPolygonBridge: oldpolygonBridge, SCAddresses: scAddresses, ClaimCompressor: claimCompressor, @@ -241,7 +243,7 @@ func (etherMan *Client) GetRollupInfoByBlockRange(ctx context.Context, fromBlock query := ethereum.FilterQuery{ FromBlock: new(big.Int).SetUint64(fromBlock), Addresses: etherMan.SCAddresses, - Topics: [][]common.Hash{{updateGlobalExitRootSignatureHash, updateL1InfoTreeSignatureHash, depositEventSignatureHash, claimEventSignatureHash, oldClaimEventSignatureHash, newWrappedTokenEventSignatureHash, verifyBatchesTrustedAggregatorSignatureHash, rollupManagerVerifyBatchesSignatureHash, insertGlobalExitRootSignatureHash}}, + Topics: [][]common.Hash{{updateGlobalExitRootSignatureHash, updateL1InfoTreeSignatureHash, depositEventSignatureHash, claimEventSignatureHash, oldClaimEventSignatureHash, newWrappedTokenEventSignatureHash, verifyBatchesTrustedAggregatorSignatureHash, rollupManagerVerifyBatchesSignatureHash, insertGlobalExitRootSignatureHash, removeLastGlobalExitRootSignatureHash}}, } if toBlock != nil { query.ToBlock = new(big.Int).SetUint64(*toBlock) @@ -417,26 +419,20 @@ func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks case insertGlobalExitRootSignatureHash: return etherMan.insertSovereignChainL2GER(ctx, vLog, blocks, blocksOrder) case removeLastGlobalExitRootSignatureHash: - // TODO - return nil + return etherMan.removeLastL2GER(ctx, vLog, blocks, blocksOrder) case setBridgeManagerSignatureHash: - // TODO etherMan.logger.Debug("setBridgeManager event detected. Ignoring...") return nil case setSovereignTokenAddressSignatureHash: - // TODO etherMan.logger.Debug("setSovereignTokenAddress event detected. Ignoring...") return nil case migrateLegacyTokenSignatureHash: - // TODO etherMan.logger.Debug("migrateLegacyToken event detected. Ignoring...") return nil case removeLegacySovereignTokenAddressSignatureHash: - // TODO etherMan.logger.Debug("removeLegacySovereignTokenAddress event detected. Ignoring...") return nil case setSovereignWETHAddressSignatureHash: - // TODO etherMan.logger.Debug("setSovereignWETHAddress event detected. Ignoring...") return nil } @@ -444,6 +440,39 @@ func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks return nil } +func (etherMan *Client) removeLastL2GER(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { + etherMan.logger.Debug("removeLastGlobalExitRoot event detected. Processing...") + var gExitRoot GlobalExitRoot + l2GER, err := etherMan.GerL2SovereignChain.ParseRemoveLastGlobalExitRoot(vLog) + if err != nil { + return err + } + gExitRoot.GlobalExitRoot = l2GER.RemovedGlobalExitRoot + gExitRoot.BlockNumber = vLog.BlockNumber + + if len(*blocks) == 0 || ((*blocks)[len(*blocks)-1].BlockHash != vLog.BlockHash || (*blocks)[len(*blocks)-1].BlockNumber != vLog.BlockNumber) { + fullBlock, err := etherMan.EtherClient.HeaderByHash(ctx, vLog.BlockHash) + if err != nil { + return fmt.Errorf("error getting hashParent. BlockNumber: %d. Error: %v", vLog.BlockNumber, err) + } + t := time.Unix(int64(fullBlock.Time), 0) + block := prepareBlock(vLog, t, fullBlock) + block.RemoveL2GER = append(block.RemoveL2GER, gExitRoot) + *blocks = append(*blocks, block) + } else if (*blocks)[len(*blocks)-1].BlockHash == vLog.BlockHash && (*blocks)[len(*blocks)-1].BlockNumber == vLog.BlockNumber { + (*blocks)[len(*blocks)-1].RemoveL2GER = append((*blocks)[len(*blocks)-1].RemoveL2GER, gExitRoot) + } else { + etherMan.logger.Error("Error processing UpdateGlobalExitRoot event. BlockHash:", vLog.BlockHash, ". BlockNumber: ", vLog.BlockNumber) + return fmt.Errorf("error processing UpdateGlobalExitRoot event") + } + or := Order{ + Name: RemoveL2GEROrder, + Pos: len((*blocks)[len(*blocks)-1].RemoveL2GER) - 1, + } + (*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash] = append((*blocksOrder)[(*blocks)[len(*blocks)-1].BlockHash], or) + return nil +} + func (etherMan *Client) insertSovereignChainL2GER(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { etherMan.logger.Debug("insertSovereignChainL2GER event detected. Processing...") var gExitRoot GlobalExitRoot @@ -524,7 +553,7 @@ func (etherMan *Client) processUpdateGlobalExitRootEvent(ctx context.Context, ma func (etherMan *Client) depositEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { etherMan.logger.Debug("Deposit event detected. Processing...") - d, err := etherMan.PolygonBridge.ParseBridgeEvent(vLog) + d, err := etherMan.PolygonBridgeV2.ParseBridgeEvent(vLog) if err != nil { return err } @@ -573,7 +602,7 @@ func (etherMan *Client) oldClaimEvent(ctx context.Context, vLog types.Log, block func (etherMan *Client) newClaimEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { etherMan.logger.Debug("New claim event detected. Processing...") - c, err := etherMan.PolygonBridge.ParseClaimEvent(vLog) + c, err := etherMan.PolygonBridgeV2.ParseClaimEvent(vLog) if err != nil { return err } @@ -620,7 +649,7 @@ func (etherMan *Client) claimEvent(ctx context.Context, vLog types.Log, blocks * func (etherMan *Client) tokenWrappedEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { etherMan.logger.Debug("TokenWrapped event detected. Processing...") - tw, err := etherMan.PolygonBridge.ParseNewWrappedToken(vLog) + tw, err := etherMan.PolygonBridgeV2.ParseNewWrappedToken(vLog) if err != nil { return err } @@ -677,18 +706,6 @@ func (etherMan *Client) HeaderByNumber(ctx context.Context, number *big.Int) (*t return etherMan.EtherClient.HeaderByNumber(ctx, number) } -// EthBlockByNumber function retrieves the ethereum block information by ethereum block number. -func (etherMan *Client) EthBlockByNumber(ctx context.Context, blockNumber uint64) (*types.Block, error) { - block, err := etherMan.EtherClient.BlockByNumber(ctx, new(big.Int).SetUint64(blockNumber)) - if err != nil { - if errors.Is(err, ethereum.NotFound) || err.Error() == "block does not exist in blockchain" { - return nil, ErrNotFound - } - return nil, err - } - return block, nil -} - // GetNetworkID gets the network ID of the dedicated chain. func (etherMan *Client) GetNetworkID() uint32 { return etherMan.NetworkID diff --git a/etherman/etherman_test.go b/etherman/etherman_test.go index ae6ea3ba..e3a87505 100644 --- a/etherman/etherman_test.go +++ b/etherman/etherman_test.go @@ -6,9 +6,9 @@ import ( "math/big" "testing" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/polygonzkevmbridgev2" "github.com/0xPolygonHermez/zkevm-bridge-service/log" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" @@ -25,7 +25,7 @@ func init() { } // This function prepare the blockchain, the wallet with funds and deploy the smc -func newTestingEnv() (*Client, *simulated.Backend, *bind.TransactOpts, common.Address, *polygonzkevmbridge.Polygonzkevmbridge, *polygonzkevm.Polygonzkevm) { +func newTestingEnv() (*Client, *simulated.Backend, *bind.TransactOpts, common.Address, *polygonzkevmbridgev2.Polygonzkevmbridgev2, *polygonzkevm.Polygonzkevm) { privateKey, err := crypto.GenerateKey() if err != nil { log.Fatal(err) @@ -52,7 +52,7 @@ func TestGEREvent(t *testing.T) { amount := big.NewInt(1000000000000000) auth.Value = amount - _, err = etherman.PolygonBridge.BridgeAsset(auth, 1, auth.From, amount, common.Address{}, true, []byte{}) + _, err = etherman.PolygonBridgeV2.BridgeAsset(auth, 1, auth.From, amount, common.Address{}, true, []byte{}) require.NoError(t, err) // Mine the tx in a block diff --git a/etherman/simulated.go b/etherman/simulated.go index 9bd8aa4b..03c3822e 100644 --- a/etherman/simulated.go +++ b/etherman/simulated.go @@ -5,6 +5,7 @@ import ( "fmt" "math/big" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/polygonzkevmbridgev2" "github.com/0xPolygonHermez/zkevm-bridge-service/log" mockbridge "github.com/0xPolygonHermez/zkevm-bridge-service/test/mocksmartcontracts/polygonzkevmbridge" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/mockpolygonrollupmanager" @@ -12,7 +13,6 @@ import ( "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/pol" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonrollupmanager" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevm" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/proxy" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -24,7 +24,7 @@ import ( // NewSimulatedEtherman creates an etherman that uses a simulated blockchain. It's important to notice that the ChainID of the auth // must be 1337. The address that holds the auth will have an initial balance of 10 ETH -func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (*Client, *simulated.Backend, common.Address, *polygonzkevmbridge.Polygonzkevmbridge, *polygonzkevm.Polygonzkevm, error) { +func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (*Client, *simulated.Backend, common.Address, *polygonzkevmbridgev2.Polygonzkevmbridgev2, *polygonzkevm.Polygonzkevm, error) { if auth == nil { // read only client return &Client{}, nil, common.Address{}, nil, nil, nil @@ -103,7 +103,7 @@ func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (*Client, *simula log.Error("error: ", err) return nil, nil, common.Address{}, nil, nil, err } - br, err := polygonzkevmbridge.NewPolygonzkevmbridge(bridgeAddr, client.Client()) + br, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridgeAddr, client.Client()) if err != nil { log.Error("error: ", err) return nil, nil, common.Address{}, nil, nil, err @@ -197,5 +197,5 @@ func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (*Client, *simula } logger := log.WithFields("networkID", networkID) - return &Client{EtherClient: client.Client(), PolygonBridge: br, PolygonZkEVMGlobalExitRoot: globalExitRoot, PolygonRollupManager: rollupManager, SCAddresses: []common.Address{exitManagerAddr, bridgeAddr, mockRollupManagerAddr}, logger: logger}, client, polAddr, br, trueZkevm, nil + return &Client{EtherClient: client.Client(), PolygonBridgeV2: br, PolygonZkEVMGlobalExitRoot: globalExitRoot, PolygonRollupManager: rollupManager, SCAddresses: []common.Address{exitManagerAddr, bridgeAddr, mockRollupManagerAddr}, logger: logger}, client, polAddr, br, trueZkevm, nil } diff --git a/etherman/smartcontracts/abi/bridgel2sovereignchain.abi b/etherman/smartcontracts/abi/bridgel2sovereignchain.abi index f6a62dc5..cb56d40b 100644 --- a/etherman/smartcontracts/abi/bridgel2sovereignchain.abi +++ b/etherman/smartcontracts/abi/bridgel2sovereignchain.abi @@ -14,11 +14,21 @@ "name": "AmountDoesNotMatchMsgValue", "type": "error" }, + { + "inputs": [], + "name": "ClaimNotSet", + "type": "error" + }, { "inputs": [], "name": "DestinationNetworkInvalid", "type": "error" }, + { + "inputs": [], + "name": "EmergencyStateNotAllowed", + "type": "error" + }, { "inputs": [], "name": "EtherTransferFailed", @@ -94,11 +104,6 @@ "name": "NotValidAmount", "type": "error" }, - { - "inputs": [], - "name": "NotValidBridgeManager", - "type": "error" - }, { "inputs": [], "name": "NotValidOwner", @@ -419,6 +424,25 @@ "name": "SetSovereignWETHAddress", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "sourceBridgeNetwork", + "type": "uint32" + } + ], + "name": "UnsetClaim", + "type": "event" + }, { "inputs": [], "name": "BASE_INIT_BYTECODE_WRAPPED_TOKEN", @@ -1172,7 +1196,7 @@ "inputs": [ { "internalType": "address", - "name": "sovereignTokenAddress", + "name": "legacySovereignTokenAddress", "type": "address" } ], @@ -1222,34 +1246,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "originNetwork", - "type": "uint32" - }, - { - "internalType": "address", - "name": "originTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "sovereignTokenAddress", - "type": "address" - }, - { - "internalType": "bool", - "name": "isNotMintable", - "type": "bool" - } - ], - "name": "setSovereignTokenAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -1287,6 +1283,24 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint32[]", + "name": "leafIndexes", + "type": "uint32[]" + }, + { + "internalType": "uint32[]", + "name": "sourceBridgeNetworks", + "type": "uint32[]" + } + ], + "name": "unsetMultipleClaimedBitmap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "updateGlobalExitRoot", diff --git a/etherman/smartcontracts/abi/globalexitrootmanagerl2sovereignchain.abi b/etherman/smartcontracts/abi/globalexitrootmanagerl2sovereignchain.abi index 263bda2a..c8bd1420 100644 --- a/etherman/smartcontracts/abi/globalexitrootmanagerl2sovereignchain.abi +++ b/etherman/smartcontracts/abi/globalexitrootmanagerl2sovereignchain.abi @@ -30,6 +30,11 @@ "name": "OnlyAllowedContracts", "type": "error" }, + { + "inputs": [], + "name": "OnlyGlobalExitRootRemover", + "type": "error" + }, { "inputs": [], "name": "OnlyGlobalExitRootUpdater", @@ -74,6 +79,32 @@ "name": "RemoveLastGlobalExitRoot", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newGlobalExitRootRemover", + "type": "address" + } + ], + "name": "SetGlobalExitRootRemover", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newGlobalExitRootUpdater", + "type": "address" + } + ], + "name": "SetGlobalExitRootUpdater", + "type": "event" + }, { "inputs": [], "name": "bridgeAddress", @@ -106,6 +137,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "globalExitRootRemover", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "globalExitRootUpdater", @@ -125,6 +169,11 @@ "internalType": "address", "name": "_globalExitRootUpdater", "type": "address" + }, + { + "internalType": "address", + "name": "_globalExitRootRemover", + "type": "address" } ], "name": "initialize", @@ -184,6 +233,32 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_globalExitRootRemover", + "type": "address" + } + ], + "name": "setGlobalExitRootRemover", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_globalExitRootUpdater", + "type": "address" + } + ], + "name": "setGlobalExitRootUpdater", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/etherman/smartcontracts/abi/polygonzkevmbridgev2.abi b/etherman/smartcontracts/abi/polygonzkevmbridgev2.abi new file mode 100644 index 00000000..056b833c --- /dev/null +++ b/etherman/smartcontracts/abi/polygonzkevmbridgev2.abi @@ -0,0 +1,1004 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "AmountDoesNotMatchMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "DestinationNetworkInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "EtherTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FailedTokenWrappedDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSmtProof", + "type": "error" + }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, + { + "inputs": [], + "name": "MessageFailed", + "type": "error" + }, + { + "inputs": [], + "name": "MsgValueNotZero", + "type": "error" + }, + { + "inputs": [], + "name": "NativeTokenIsEther", + "type": "error" + }, + { + "inputs": [], + "name": "NoValueInMessagesOnGasTokenNetworks", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidOwner", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "leafType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "depositCount", + "type": "uint32" + } + ], + "name": "BridgeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ClaimEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateDeactivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "wrappedTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "NewWrappedToken", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_INIT_BYTECODE_WRAPPED_TOKEN", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETHToken", + "outputs": [ + { + "internalType": "contract TokenWrapped", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "permitData", + "type": "bytes" + } + ], + "name": "bridgeAsset", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "bridgeMessage", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountWETH", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "bridgeMessageWETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leafHash", + "type": "bytes32" + }, + { + "internalType": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + } + ], + "name": "calculateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "calculateTokenWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[32]", + "name": "smtProofLocalExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "bytes32[32]", + "name": "smtProofRollupExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "claimAsset", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[32]", + "name": "smtProofLocalExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "bytes32[32]", + "name": "smtProofRollupExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "claimMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "claimedBitMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "leafType", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "metadataHash", + "type": "bytes32" + } + ], + "name": "getLeafValue", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + } + ], + "name": "getTokenWrappedAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonRollupManager", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "sourceBridgeNetwork", + "type": "uint32" + } + ], + "name": "isClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isEmergencyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdatedDepositCount", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkID", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "polygonRollupManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "precalculatedWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "tokenInfoToWrappedToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "updateGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leafHash", + "type": "bytes32" + }, + { + "internalType": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "verifyMerkleProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "wrappedTokenToTokenInfo", + "outputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/etherman/smartcontracts/bin/bridgel2sovereignchain.bin b/etherman/smartcontracts/bin/bridgel2sovereignchain.bin index 28e219f1..6b4c37ab 100644 --- a/etherman/smartcontracts/bin/bridgel2sovereignchain.bin +++ b/etherman/smartcontracts/bin/bridgel2sovereignchain.bin @@ -1 +1 @@ -608060405234801562000010575f80fd5b506200001b6200002b565b620000256200002b565b620000e9565b5f54610100900460ff1615620000975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000e7575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615fe880620000f75f395ff3fe60806040526004361061023e575f3560e01c80638ed7e3f211610134578063c0f49163116100b3578063dbc1697611610078578063dbc16976146102a7578063eabd372a146106fc578063ee25560b1461071b578063f5efcd7914610746578063f811bff714610765578063fb57083414610784575f80fd5b8063c0f4916314610657578063cc46163214610685578063ccaa2d11146106a4578063cd586579146106c3578063d02103ca146106d6575f80fd5b8063b8b284d0116100f9578063b8b284d0146105b6578063bab161bf146105d5578063be5831c7146105f6578063bf130d7f14610619578063c00f14ab14610638575f80fd5b80638ed7e3f21461051b5780639e76158f1461053a578063aaa13cc214610559578063b42f6b3a14610578578063b458696214610597575f80fd5b80633e197043116101c057806379e2cf971161018557806379e2cf971461048157806381b1c1741461049557806383c43a55146104c957806383f24403146104dd5780638c0dd470146104fc575f80fd5b80633e197043146103f15780634b2f336d1461041057806357cfbee31461042f5780635ca1e1651461044e5780637843298b14610462575f80fd5b806327aef4e81161020657806327aef4e8146102ef5780632dfdf0b514610310578063318aee3d146103335780633c351e101461039a5780633cbc795b146103b9575f80fd5b806314cc01a01461024257806315064c961461027e5780632072f6c5146102a757806322e95f2c146102bd578063240ff378146102dc575b5f80fd5b34801561024d575f80fd5b5060a354610261906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610289575f80fd5b506068546102979060ff1681565b6040519015158152602001610275565b3480156102b2575f80fd5b506102bb6107a3565b005b3480156102c8575f80fd5b506102616102d7366004613280565b6107bc565b6102bb6102ea366004613306565b61080a565b3480156102fa575f80fd5b5061030361087a565b60405161027591906133c7565b34801561031b575f80fd5b5061032560535481565b604051908152602001610275565b34801561033e575f80fd5b5061037661034d3660046133e0565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610275565b3480156103a5575f80fd5b50606d54610261906001600160a01b031681565b3480156103c4575f80fd5b50606d546103dc90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610275565b3480156103fc575f80fd5b5061032561040b366004613409565b610906565b34801561041b575f80fd5b50606f54610261906001600160a01b031681565b34801561043a575f80fd5b506102bb6104493660046135bb565b610992565b348015610459575f80fd5b50610325610a88565b34801561046d575f80fd5b5061026161047c3660046136ba565b610b64565b34801561048c575f80fd5b506102bb610b8d565b3480156104a0575f80fd5b506102616104af366004613700565b606a6020525f90815260409020546001600160a01b031681565b3480156104d4575f80fd5b50610303610bb0565b3480156104e8575f80fd5b506103256104f7366004613728565b610bcf565b348015610507575f80fd5b506102bb6105163660046137d7565b610ca4565b348015610526575f80fd5b50606c54610261906001600160a01b031681565b348015610545575f80fd5b506102bb6105543660046138a0565b610f85565b348015610564575f80fd5b506102616105733660046138ca565b6110bd565b348015610583575f80fd5b506102bb61059236600461395f565b6111bd565b3480156105a2575f80fd5b506102bb6105b13660046133e0565b6111fa565b3480156105c1575f80fd5b506102bb6105d03660046139b6565b611354565b3480156105e0575f80fd5b506068546103dc90610100900463ffffffff1681565b348015610601575f80fd5b506068546103dc90600160c81b900463ffffffff1681565b348015610624575f80fd5b506102bb610633366004613a33565b6113cd565b348015610643575f80fd5b506103036106523660046133e0565b611497565b348015610662575f80fd5b506102976106713660046133e0565b60a26020525f908152604090205460ff1681565b348015610690575f80fd5b5061029761069f366004613a5f565b6114dc565b3480156106af575f80fd5b506102bb6106be366004613a90565b611563565b6102bb6106d1366004613b73565b611964565b3480156106e1575f80fd5b5060685461026190600160281b90046001600160a01b031681565b348015610707575f80fd5b506102bb6107163660046133e0565b611cfa565b348015610726575f80fd5b50610325610735366004613700565b60696020525f908152604090205481565b348015610751575f80fd5b506102bb610760366004613a90565b611da0565b348015610770575f80fd5b506102bb61077f366004613c02565b612003565b34801561078f575f80fd5b5061029761079e366004613c91565b612090565b604051631bb787f360e11b815260040160405180910390fd5b5f606a5f84846040516020016107d3929190613cd6565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff161561082e57604051630bc011ff60e21b815260040160405180910390fd5b34158015906108475750606f546001600160a01b031615155b15610865576040516301bd897160e61b815260040160405180910390fd5b6108738585348686866120a7565b5050505050565b606e805461088790613d00565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613d00565b80156108fe5780601f106108d5576101008083540402835291602001916108fe565b820191905f5260205f20905b8154815290600101906020018083116108e157829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b60a3546001600160a01b031633146109bd576040516357b738d160e11b815260040160405180910390fd5b825184511415806109d057508151845114155b806109dd57508051845114155b156109fb5760405163434f49f560e11b815260040160405180910390fd5b5f5b825181101561087357610a76858281518110610a1b57610a1b613d38565b6020026020010151858381518110610a3557610a35613d38565b6020026020010151858481518110610a4f57610a4f613d38565b6020026020010151858581518110610a6957610a69613d38565b6020026020010151612171565b80610a8081613d60565b9150506109fd565b6053545f90819081805b6020811015610b5b578083901c600116600103610aef5760338160208110610abc57610abc613d38565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610b1c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610b5390613d60565b915050610a92565b50919392505050565b5f610b858484610b7385612321565b610b7c866123dc565b61057387612490565b949350505050565b605354606854600160c81b900463ffffffff161015610bae57610bae612544565b565b60405180611ba00160405280611b66815260200161444d611b66913981565b5f83815b6020811015610c9b57600163ffffffff8516821c81169003610c3e57848160208110610c0157610c01613d38565b602002013582604051602001610c21929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c89565b81858260208110610c5157610c51613d38565b6020020135604051602001610c70929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610c9381613d60565b915050610bd3565b50949350505050565b5f54610100900460ff1615808015610cc257505f54600160ff909116105b80610cdb5750303b158015610cdb57505f5460ff166001145b610d005760405162461bcd60e51b8152600401610cf790613d78565b60405180910390fd5b5f805460ff191660011790558015610d21575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8d160265010000000000600160c81b03191617600160281b6001600160a01b038a81169190910291909117909155606c80546001600160a01b03199081168984161790915560a380549091168683161790558916610df15763ffffffff881615610db557604051630d43a60960e11b815260040160405180910390fd5b6001600160a01b038316151580610dce57506001821515145b15610dec57604051630e6e237560e11b815260040160405180910390fd5b610f2c565b606d805463ffffffff8a16600160a01b026001600160c01b03199091166001600160a01b038c1617179055606e610e288682613e0b565b506001600160a01b038316610ef457811515600103610e5a57604051630e6e237560e11b815260040160405180910390fd5b610ecf5f801b6012604051602001610ebb91906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b6040516020818303038152906040526125d2565b606f80546001600160a01b0319166001600160a01b0392909216919091179055610f2c565b606f80546001600160a01b0319166001600160a01b0385169081179091555f90815260a260205260409020805460ff19168315151790555b610f3461264c565b8015610f79575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b038083165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290610fe15760405163828d566360e01b815260040160405180910390fd5b5f606a5f835f01518460200151604051602001610fff929190613cd6565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b039081169150841681036110525760405163e273c4a160e01b815260040160405180910390fd5b61105c848461267a565b61106781338561270a565b604080513381526001600160a01b0386811660208301528316818301526060810185905290517fb7f8fd4d1faf9b2929dc269f59c53e3a2bccc44e9950f33a568fcbcb37eb69a99181900360800190a150505050565b5f8086866040516020016110d2929190613cd6565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b66815260200161444d611b66913989898960405160200161112393929190613ec6565b60408051601f19818403018152908290526111419291602001613efe565b6040516020818303038152906040528051906020012060405160200161119994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60a3546001600160a01b031633146111e8576040516357b738d160e11b815260040160405180910390fd5b6111f484848484612171565b50505050565b60a3546001600160a01b03163314611225576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038082165f908152606b6020908152604080832081518083018352905463ffffffff8116808352600160201b909104909516818401819052915190946112759390929101613cd6565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031615806112c957505f818152606a60205260409020546001600160a01b038481169116145b156112e75760405163e0c897a760e01b815260040160405180910390fd5b6001600160a01b0383165f818152606b6020908152604080832080546001600160c01b031916905560a2825291829020805460ff1916905590519182527fc2ae0bd0ec0fd0352bfe5bacac49637af342c1e40f1b80a7f74440dc7fe3f063910160405180910390a1505050565b60685460ff161561137857604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b03166113a15760405163dde3cda760e01b815260040160405180910390fd5b606f546113b7906001600160a01b03168561267a565b6113c58686868686866120a7565b505050505050565b60a3546001600160a01b031633146113f8576040516357b738d160e11b815260040160405180910390fd5b606d546001600160a01b031661142157604051634cb4711360e11b815260040160405180910390fd5b606f80546001600160a01b0319166001600160a01b0384169081179091555f81815260a26020908152604091829020805460ff19168515159081179091558251938452908301527fc7318b7ed6ba4f2908a3de396d8ab49b1dadb55db5b55123247a401f29ff8d82910160405180910390a15050565b60606114a282612321565b6114ab836123dc565b6114b484612490565b6040516020016114c693929190613ec6565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015611501575063ffffffff83166001145b15611513575063ffffffff831661153a565b611527600160201b63ffffffff8516613f2c565b6115379063ffffffff8616613f43565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161561158757604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115b7576040516302caf51760e11b815260040160405180910390fd5b6115ea8c8c8c8c8c6115e55f8e8e8e8e8e8e8e6040516115d8929190613f56565b6040518091039020610906565b61279c565b6001600160a01b0386166116d157606f546001600160a01b03166116b5575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015611640576020820181803683370190505b5060405161164e9190613f65565b5f6040518083038185875af1925050503d805f8114611688576040519150601f19603f3d011682016040523d82523d5f602084013e61168d565b606091505b50509050806116af57604051630ce8f45160e31b815260040160405180910390fd5b506118fa565b606f546116cc906001600160a01b0316858561270a565b6118fa565b606d546001600160a01b0387811691161480156116ff5750606d5463ffffffff888116600160a01b90920416145b15611716575f6001600160a01b0385168482611616565b60685463ffffffff610100909104811690881603611742576116cc6001600160a01b03871685856128fa565b5f8787604051602001611756929190613cd6565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806118ec575f6117cb8386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125d292505050565b90506117d881888861270a565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516118de959493929190613fa8565b60405180910390a1506118f7565b6118f781878761270a565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff161561198857604051630bc011ff60e21b815260040160405180910390fd5b61199061295d565b60685463ffffffff6101009091048116908816036119c1576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816611aa4578834146119f45760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611a2190613d00565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4d90613d00565b8015611a985780601f10611a6f57610100808354040283529160200191611a98565b820191905f5260205f20905b815481529060010190602001808311611a7b57829003601f168201915b50505050509150611c71565b3415611ac35760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603611ae857611ae3888a61267a565b611c71565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015611b4757611b36898b61267a565b602081015181519095509350611c64565b8515611b5957611b59898b89896129b6565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611b9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc19190613fe0565b9050611bd86001600160a01b038b1633308e612cf1565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611c1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c409190613fe0565b9050611c4c8282613ff7565b6068548c9850610100900463ffffffff169650935050505b611c6d89611497565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611cb098979695949392919061400a565b60405180910390a1611cd6611cd15f85878f8f878980519060200120610906565b612d29565b8615611ce457611ce4612544565b50505050611cf160018055565b50505050505050565b60a3546001600160a01b03163314611d25576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038116611d4c57604051631bb787f360e11b815260040160405180910390fd5b60a380546001600160a01b0319166001600160a01b0383169081179091556040519081527f32cf74f8a6d5f88593984d2cd52be5592bfa6884f5896175801a5069ef09cd679060200160405180910390a150565b60685460ff1615611dc457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611df4576040516302caf51760e11b815260040160405180910390fd5b611e168c8c8c8c8c6115e560018e8e8e8e8e8e8e6040516115d8929190613f56565b606f545f906001600160a01b0316611ec957846001600160a01b031684888a8686604051602401611e4a9493929190614074565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611e7f9190613f65565b5f6040518083038185875af1925050503d805f8114611eb9576040519150601f19603f3d011682016040523d82523d5f602084013e611ebe565b606091505b505080915050611f7a565b606f54611ee0906001600160a01b0316868661270a565b846001600160a01b031687898585604051602401611f019493929190614074565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611f369190613f65565b5f604051808303815f865af19150503d805f8114611f6f576040519150601f19603f3d011682016040523d82523d5f602084013e611f74565b606091505b50909150505b80611f98576040516337e391c360e01b815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561202157505f54600160ff909116105b8061203a5750303b15801561203a57505f5460ff166001145b6120565760405162461bcd60e51b8152600401610cf790613d78565b5f805460ff191660011790558015612077575f805461ff0019166101001790555b60405163f57ac68360e01b815260040160405180910390fd5b5f8161209d868686610bcf565b1495945050505050565b60685463ffffffff6101009091048116908716036120d8576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405161212c999897969594939291906140ae565b60405180910390a1612163611cd16001606860019054906101000a900463ffffffff16338a8a8a89896040516115d8929190613f56565b82156113c5576113c5612544565b6001600160a01b038316158061218e57506001600160a01b038216155b156121ac5760405163f6b2911f60e01b815260040160405180910390fd5b60685463ffffffff6101009091048116908516036121dd5760405163658b23ad60e01b815260040160405180910390fd5b6001600160a01b038281165f908152606b6020526040902054600160201b9004161561221c576040516317abdeeb60e21b815260040160405180910390fd5b5f8484604051602001612230929190613cd6565b60408051808303601f1901815282825280516020918201205f818152606a835283812080546001600160a01b0319166001600160a01b038a8116918217909255868601865263ffffffff8c81168089528c8416878a01818152848752606b89528987209a518b54915194166001600160c01b031990911617600160201b93909516929092029390931790975560a2855291859020805460ff191689151590811790915585519182529381019590955292840192909252606083015291507fdbe8a5da6a7a916d9adfda9160167a0f8a3da415ee6610e810e753853597fce79060800160405180910390a15050505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916123679190613f65565b5f60405180830381855afa9150503d805f811461239f576040519150601f19603f3d011682016040523d82523d5f602084013e6123a4565b606091505b5091509150816123d357604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610b85565b610b8581612e11565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916124229190613f65565b5f60405180830381855afa9150503d805f811461245a576040519150601f19603f3d011682016040523d82523d5f602084013e61245f565b606091505b5091509150816123d357604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610b85565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916124d59190613f65565b5f60405180830381855afa9150503d805f811461250d576040519150601f19603f3d011682016040523d82523d5f602084013e612512565b606091505b5091509150818015612525575080516020145b612530576012610b85565b80806020019051810190610b85919061411a565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d61258b610a88565b6040518263ffffffff1660e01b81526004016125a991815260200190565b5f604051808303815f87803b1580156125c0575f80fd5b505af11580156111f4573d5f803e3d5ffd5b5f8060405180611ba00160405280611b66815260200161444d611b66913983604051602001612602929190613efe565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612645576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b5f54610100900460ff166126725760405162461bcd60e51b8152600401610cf790614135565b610bae612f9a565b6001600160a01b0382165f90815260a2602052604090205460ff16156126b3576126af6001600160a01b038316333084612cf1565b5050565b604051632770a7eb60e21b8152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b1580156126f8575f80fd5b505af11580156113c5573d5f803e3d5ffd5b6001600160a01b0383165f90815260a2602052604090205460ff16156127435761273e6001600160a01b03841683836128fa565b505050565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b15801561278a575f80fd5b505af1158015611cf1573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612812573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128369190613fe0565b9050805f0361285757604051622f6fad60e01b815260040160405180910390fd5b5f806801000000000000000087161561289b57869150612879848a8489612090565b612896576040516338105f3b60e21b815260040160405180910390fd5b6128e5565b602087901c6128ab816001614180565b91508792506128c66128be868c86610bcf565b8a8389612090565b6128e3576040516338105f3b60e21b815260040160405180910390fd5b505b6128ef8282612fc0565b505050505050505050565b6040516001600160a01b03831660248201526044810182905261273e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613066565b6002600154036129af5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610cf7565b6002600155565b5f6129c4600482848661419d565b6129cd916141c4565b9050632afa533160e01b6001600160e01b0319821601612b5c575f8080808080806129fb896004818d61419d565b810190612a0891906141f4565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614612a485760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014612a715760405163750643af60e01b815260040160405180910390fd5b8a8514612a91576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691612b0f9190613f65565b5f604051808303815f865af19150503d805f8114612b48576040519150601f19603f3d011682016040523d82523d5f602084013e612b4d565b606091505b50505050505050505050610873565b6001600160e01b031981166323f2ebc360e21b14612b8d57604051637141605d60e11b815260040160405180910390fd5b5f80808080808080612ba28a6004818e61419d565b810190612baf9190614243565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614612bf15760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014612c1a5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691612ca19190613f65565b5f604051808303815f865af19150503d805f8114612cda576040519150601f19603f3d011682016040523d82523d5f602084013e612cdf565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526111f49085906323b872dd60e01b90608401612926565b806001612d38602060026143a1565b612d429190613ff7565b60535410612d63576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154612d7290613d60565b918290555090505f5b6020811015612e02578082901c600116600103612dae578260338260208110612da657612da6613d38565b015550505050565b60338160208110612dc157612dc1613d38565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612dfa90613d60565b915050612d7b565b5061273e6143ac565b60018055565b60606040825110612e30578180602001905181019061080491906143c0565b8151602003612f67575f5b602081108015612e6a5750828181518110612e5857612e58613d38565b01602001516001600160f81b03191615155b15612e815780612e7981613d60565b915050612e3b565b805f03612eb85750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115612ed157612ed1613483565b6040519080825280601f01601f191660200182016040528015612efb576020820181803683370190505b5090505f5b82811015612f5f57848181518110612f1a57612f1a613d38565b602001015160f81c60f81b828281518110612f3757612f37613d38565b60200101906001600160f81b03191690815f1a90535080612f5781613d60565b915050612f00565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16612e0b5760405162461bcd60e51b8152600401610cf790614135565b6068545f90610100900463ffffffff16158015612fe3575063ffffffff82166001145b15612ff5575063ffffffff821661301c565b613009600160201b63ffffffff8416613f2c565b6130199063ffffffff8516613f43565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611cf157604051630c8d9eab60e31b815260040160405180910390fd5b5f6130ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131399092919063ffffffff16565b905080515f14806130da5750808060200190518101906130da9190614431565b61273e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cf7565b6060610b8584845f85855f80866001600160a01b0316858760405161315e9190613f65565b5f6040518083038185875af1925050503d805f8114613198576040519150601f19603f3d011682016040523d82523d5f602084013e61319d565b606091505b50915091506131ae878383876131b9565b979650505050505050565b606083156132275782515f03613220576001600160a01b0385163b6132205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cf7565b5081610b85565b610b85838381511561323c5781518083602001fd5b8060405162461bcd60e51b8152600401610cf791906133c7565b803563ffffffff81168114612f95575f80fd5b6001600160a01b038116811461327d575f80fd5b50565b5f8060408385031215613291575f80fd5b61329a83613256565b915060208301356132aa81613269565b809150509250929050565b801515811461327d575f80fd5b5f8083601f8401126132d2575f80fd5b5081356001600160401b038111156132e8575f80fd5b6020830191508360208285010111156132ff575f80fd5b9250929050565b5f805f805f6080868803121561331a575f80fd5b61332386613256565b9450602086013561333381613269565b93506040860135613343816132b5565b925060608601356001600160401b0381111561335d575f80fd5b613369888289016132c2565b969995985093965092949392505050565b5f5b8381101561339457818101518382015260200161337c565b50505f910152565b5f81518084526133b381602086016020860161337a565b601f01601f19169290920160200192915050565b602081525f6133d9602083018461339c565b9392505050565b5f602082840312156133f0575f80fd5b81356133d981613269565b60ff8116811461327d575f80fd5b5f805f805f805f60e0888a03121561341f575f80fd5b873561342a816133fb565b965061343860208901613256565b9550604088013561344881613269565b945061345660608901613256565b9350608088013561346681613269565b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156134bf576134bf613483565b604052919050565b5f6001600160401b038211156134df576134df613483565b5060051b60200190565b5f82601f8301126134f8575f80fd5b8135602061350d613508836134c7565b613497565b82815260059290921b8401810191818101908684111561352b575f80fd5b8286015b8481101561354f57803561354281613269565b835291830191830161352f565b509695505050505050565b5f82601f830112613569575f80fd5b81356020613579613508836134c7565b82815260059290921b84018101918181019086841115613597575f80fd5b8286015b8481101561354f5780356135ae816132b5565b835291830191830161359b565b5f805f80608085870312156135ce575f80fd5b84356001600160401b03808211156135e4575f80fd5b818701915087601f8301126135f7575f80fd5b81356020613607613508836134c7565b82815260059290921b8401810191818101908b841115613625575f80fd5b948201945b8386101561364a5761363b86613256565b8252948201949082019061362a565b9850508801359250508082111561365f575f80fd5b61366b888389016134e9565b94506040870135915080821115613680575f80fd5b61368c888389016134e9565b935060608701359150808211156136a1575f80fd5b506136ae8782880161355a565b91505092959194509250565b5f805f606084860312156136cc575f80fd5b6136d584613256565b925060208401356136e581613269565b915060408401356136f581613269565b809150509250925092565b5f60208284031215613710575f80fd5b5035919050565b806104008101831015610804575f80fd5b5f805f610440848603121561373b575f80fd5b8335925061374c8560208601613717565b915061375b6104208501613256565b90509250925092565b5f6001600160401b0382111561377c5761377c613483565b50601f01601f191660200190565b5f82601f830112613799575f80fd5b81356137a761350882613764565b8181528460208386010111156137bb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f805f6101208a8c0312156137f0575f80fd5b6137f98a613256565b985060208a013561380981613269565b975061381760408b01613256565b965060608a013561382781613269565b955060808a013561383781613269565b945060a08a01356001600160401b03811115613851575f80fd5b61385d8c828d0161378a565b94505060c08a013561386e81613269565b925060e08a013561387e81613269565b91506101008a013561388f816132b5565b809150509295985092959850929598565b5f80604083850312156138b1575f80fd5b82356138bc81613269565b946020939093013593505050565b5f805f805f60a086880312156138de575f80fd5b6138e786613256565b945060208601356138f781613269565b935060408601356001600160401b0380821115613912575f80fd5b61391e89838a0161378a565b94506060880135915080821115613933575f80fd5b506139408882890161378a565b9250506080860135613951816133fb565b809150509295509295909350565b5f805f8060808587031215613972575f80fd5b61397b85613256565b9350602085013561398b81613269565b9250604085013561399b81613269565b915060608501356139ab816132b5565b939692955090935050565b5f805f805f8060a087890312156139cb575f80fd5b6139d487613256565b955060208701356139e481613269565b94506040870135935060608701356139fb816132b5565b925060808701356001600160401b03811115613a15575f80fd5b613a2189828a016132c2565b979a9699509497509295939492505050565b5f8060408385031215613a44575f80fd5b8235613a4f81613269565b915060208301356132aa816132b5565b5f8060408385031215613a70575f80fd5b613a7983613256565b9150613a8760208401613256565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613aac575f80fd5b613ab68e8e613717565b9b50613ac68e6104008f01613717565b9a506108008d013599506108208d013598506108408d01359750613aed6108608e01613256565b9650613afd6108808e0135613269565b6108808d01359550613b126108a08e01613256565b9450613b226108c08e0135613269565b6108c08d013593506108e08d013592506001600160401b036109008e01351115613b4a575f80fd5b613b5b8e6109008f01358f016132c2565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613b89575f80fd5b613b9288613256565b96506020880135613ba281613269565b9550604088013594506060880135613bb981613269565b93506080880135613bc9816132b5565b925060a08801356001600160401b03811115613be3575f80fd5b613bef8a828b016132c2565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613c17575f80fd5b613c2087613256565b95506020870135613c3081613269565b9450613c3e60408801613256565b93506060870135613c4e81613269565b92506080870135613c5e81613269565b915060a08701356001600160401b03811115613c78575f80fd5b613c8489828a0161378a565b9150509295509295509295565b5f805f806104608587031215613ca5575f80fd5b84359350613cb68660208701613717565b9250613cc56104208601613256565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c90821680613d1457607f821691505b602082108103613d3257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613d7157613d71613d4c565b5060010190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f82111561273e575f81815260208120601f850160051c81016020861015613dec5750805b601f850160051c820191505b818110156113c557828155600101613df8565b81516001600160401b03811115613e2457613e24613483565b613e3881613e328454613d00565b84613dc6565b602080601f831160018114613e6b575f8415613e545750858301515b5f19600386901b1c1916600185901b1785556113c5565b5f85815260208120601f198616915b82811015613e9957888601518255948401946001909101908401613e7a565b5085821015613eb657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613ed8606083018661339c565b8281036020840152613eea818661339c565b91505060ff83166040830152949350505050565b5f8351613f0f81846020880161337a565b835190830190613f2381836020880161337a565b01949350505050565b808202811582820484141761080457610804613d4c565b8082018082111561080457610804613d4c565b818382375f9101908152919050565b5f8251613f7681846020870161337a565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906131ae9083018486613f80565b5f60208284031215613ff0575f80fd5b5051919050565b8181038181111561080457610804613d4c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161405b8483018761339c565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906140a49083018486613f80565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916141008483018789613f80565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561412a575f80fd5b81516133d9816133fb565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b63ffffffff81811683821601908082111561264557612645613d4c565b5f80858511156141ab575f80fd5b838611156141b7575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156141ec5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121561420a575f80fd5b873561421581613269565b9650602088013561422581613269565b955060408801359450606088013593506080880135613466816133fb565b5f805f805f805f80610100898b03121561425b575f80fd5b883561426681613269565b9750602089013561427681613269565b965060408901359550606089013594506080890135614294816132b5565b935060a08901356142a4816133fb565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156142fb57815f19048211156142e1576142e1613d4c565b808516156142ee57918102915b93841c93908002906142c6565b509250929050565b5f8261431157506001610804565b8161431d57505f610804565b8160018114614333576002811461433d57614359565b6001915050610804565b60ff84111561434e5761434e613d4c565b50506001821b610804565b5060208310610133831016604e8410600b841016171561437c575081810a610804565b61438683836142c1565b805f190482111561439957614399613d4c565b029392505050565b5f6133d98383614303565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156143d0575f80fd5b81516001600160401b038111156143e5575f80fd5b8201601f810184136143f5575f80fd5b805161440361350882613764565b818152856020838501011115614417575f80fd5b61442882602083016020860161337a565b95945050505050565b5f60208284031215614441575f80fd5b81516133d9816132b556fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a264697066735822122013d210c8d7909d85898f57631a6600a5629bbd76a2d79a352fa89eb87df8db9164736f6c63430008140033 \ No newline at end of file +608060405234801562000010575f80fd5b506200001b6200002b565b620000256200002b565b620000e9565b5f54610100900460ff1615620000975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000e7575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615ffb80620000f75f395ff3fe60806040526004361061023e575f3560e01c80638c0dd47011610134578063c0f49163116100b3578063dbc1697611610078578063dbc16976146102a7578063eabd372a146106fc578063ee25560b1461071b578063f5efcd7914610746578063f811bff714610765578063fb57083414610784575f80fd5b8063c0f4916314610657578063cc46163214610685578063ccaa2d11146106a4578063cd586579146106c3578063d02103ca146106d6575f80fd5b8063b8b284d0116100f9578063b8b284d0146105b6578063bab161bf146105d5578063be5831c7146105f6578063bf130d7f14610619578063c00f14ab14610638575f80fd5b80638c0dd4701461051b5780638ed7e3f21461053a5780639e76158f14610559578063aaa13cc214610578578063b458696214610597575f80fd5b80633e197043116101c057806379e2cf971161018557806379e2cf971461048157806381b1c1741461049557806383c43a55146104c957806383f24403146104dd5780638781a5c5146104fc575f80fd5b80633e197043146103f15780634b2f336d1461041057806357cfbee31461042f5780635ca1e1651461044e5780637843298b14610462575f80fd5b806327aef4e81161020657806327aef4e8146102ef5780632dfdf0b514610310578063318aee3d146103335780633c351e101461039a5780633cbc795b146103b9575f80fd5b806314cc01a01461024257806315064c961461027e5780632072f6c5146102a757806322e95f2c146102bd578063240ff378146102dc575b5f80fd5b34801561024d575f80fd5b5060a354610261906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610289575f80fd5b506068546102979060ff1681565b6040519015158152602001610275565b3480156102b2575f80fd5b506102bb6107a3565b005b3480156102c8575f80fd5b506102616102d736600461328d565b6107bc565b6102bb6102ea366004613313565b61080a565b3480156102fa575f80fd5b5061030361087a565b60405161027591906133d4565b34801561031b575f80fd5b5061032560535481565b604051908152602001610275565b34801561033e575f80fd5b5061037661034d3660046133ed565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610275565b3480156103a5575f80fd5b50606d54610261906001600160a01b031681565b3480156103c4575f80fd5b50606d546103dc90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610275565b3480156103fc575f80fd5b5061032561040b366004613416565b610906565b34801561041b575f80fd5b50606f54610261906001600160a01b031681565b34801561043a575f80fd5b506102bb6104493660046135c6565b610992565b348015610459575f80fd5b50610325610a88565b34801561046d575f80fd5b5061026161047c3660046136c5565b610b64565b34801561048c575f80fd5b506102bb610b8d565b3480156104a0575f80fd5b506102616104af36600461370b565b606a6020525f90815260409020546001600160a01b031681565b3480156104d4575f80fd5b50610303610bb0565b3480156104e8575f80fd5b506103256104f7366004613733565b610bcf565b348015610507575f80fd5b506102bb61051636600461376f565b610ca4565b348015610526575f80fd5b506102bb610535366004613841565b610d4f565b348015610545575f80fd5b50606c54610261906001600160a01b031681565b348015610564575f80fd5b506102bb61057336600461390a565b61102b565b348015610583575f80fd5b50610261610592366004613934565b611163565b3480156105a2575f80fd5b506102bb6105b13660046133ed565b611263565b3480156105c1575f80fd5b506102bb6105d03660046139c9565b6113bd565b3480156105e0575f80fd5b506068546103dc90610100900463ffffffff1681565b348015610601575f80fd5b506068546103dc90600160c81b900463ffffffff1681565b348015610624575f80fd5b506102bb610633366004613a46565b611436565b348015610643575f80fd5b506103036106523660046133ed565b611500565b348015610662575f80fd5b506102976106713660046133ed565b60a26020525f908152604090205460ff1681565b348015610690575f80fd5b5061029761069f366004613a72565b611545565b3480156106af575f80fd5b506102bb6106be366004613aa3565b611595565b6102bb6106d1366004613b86565b611996565b3480156106e1575f80fd5b5060685461026190600160281b90046001600160a01b031681565b348015610707575f80fd5b506102bb6107163660046133ed565b611d2c565b348015610726575f80fd5b5061032561073536600461370b565b60696020525f908152604090205481565b348015610751575f80fd5b506102bb610760366004613aa3565b611dab565b348015610770575f80fd5b506102bb61077f366004613c15565b61200e565b34801561078f575f80fd5b5061029761079e366004613ca4565b6120ac565b60405163441845b160e01b815260040160405180910390fd5b5f606a5f84846040516020016107d3929190613ce9565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff161561082e57604051630bc011ff60e21b815260040160405180910390fd5b34158015906108475750606f546001600160a01b031615155b15610865576040516301bd897160e61b815260040160405180910390fd5b6108738585348686866120c3565b5050505050565b606e805461088790613d13565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613d13565b80156108fe5780601f106108d5576101008083540402835291602001916108fe565b820191905f5260205f20905b8154815290600101906020018083116108e157829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b60a3546001600160a01b031633146109bd576040516357b738d160e11b815260040160405180910390fd5b825184511415806109d057508151845114155b806109dd57508051845114155b156109fb5760405163434f49f560e11b815260040160405180910390fd5b5f5b825181101561087357610a76858281518110610a1b57610a1b613d4b565b6020026020010151858381518110610a3557610a35613d4b565b6020026020010151858481518110610a4f57610a4f613d4b565b6020026020010151858581518110610a6957610a69613d4b565b602002602001015161218d565b80610a8081613d73565b9150506109fd565b6053545f90819081805b6020811015610b5b578083901c600116600103610aef5760338160208110610abc57610abc613d4b565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610b1c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610b5390613d73565b915050610a92565b50919392505050565b5f610b858484610b738561233d565b610b7c866123f8565b610592876124ac565b949350505050565b605354606854600160c81b900463ffffffff161015610bae57610bae612560565b565b60405180611ba00160405280611b668152602001614460611b66913981565b5f83815b6020811015610c9b57600163ffffffff8516821c81169003610c3e57848160208110610c0157610c01613d4b565b602002013582604051602001610c21929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c89565b81858260208110610c5157610c51613d4b565b6020020135604051602001610c70929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610c9381613d73565b915050610bd3565b50949350505050565b60a3546001600160a01b03163314610ccf576040516357b738d160e11b815260040160405180910390fd5b8051825114610cf15760405163434f49f560e11b815260040160405180910390fd5b5f5b8251811015610d4a57610d38838281518110610d1157610d11613d4b565b6020026020010151838381518110610d2b57610d2b613d4b565b60200260200101516125f4565b80610d4281613d73565b915050610cf3565b505050565b5f54610100900460ff1615808015610d6d57505f54600160ff909116105b80610d865750303b158015610d8657505f5460ff166001145b610dab5760405162461bcd60e51b8152600401610da290613d8b565b60405180910390fd5b5f805460ff191660011790558015610dcc575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8d160265010000000000600160c81b03191617600160281b6001600160a01b038a81169190910291909117909155606c80546001600160a01b03199081168984161790915560a380549091168683161790558916610e975763ffffffff881615610e6057604051630d43a60960e11b815260040160405180910390fd5b6001600160a01b038316151580610e745750815b15610e9257604051630e6e237560e11b815260040160405180910390fd5b610fd2565b606d805463ffffffff8a16600160a01b026001600160c01b03199091166001600160a01b038c1617179055606e610ece8682613e1e565b506001600160a01b038316610f9a57811515600103610f0057604051630e6e237560e11b815260040160405180910390fd5b610f755f801b6012604051602001610f6191906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b6040516020818303038152906040526126a2565b606f80546001600160a01b0319166001600160a01b0392909216919091179055610fd2565b606f80546001600160a01b0319166001600160a01b0385169081179091555f90815260a260205260409020805460ff19168315151790555b610fda61271c565b801561101f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b038083165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052906110875760405163828d566360e01b815260040160405180910390fd5b5f606a5f835f015184602001516040516020016110a5929190613ce9565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b039081169150841681036110f85760405163e273c4a160e01b815260040160405180910390fd5b611102848461274a565b61110d8133856127da565b604080513381526001600160a01b0386811660208301528316818301526060810185905290517fb7f8fd4d1faf9b2929dc269f59c53e3a2bccc44e9950f33a568fcbcb37eb69a99181900360800190a150505050565b5f808686604051602001611178929190613ce9565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001614460611b6691398989896040516020016111c993929190613ed9565b60408051601f19818403018152908290526111e79291602001613f11565b6040516020818303038152906040528051906020012060405160200161123f94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60a3546001600160a01b0316331461128e576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038082165f908152606b6020908152604080832081518083018352905463ffffffff8116808352600160201b909104909516818401819052915190946112de9390929101613ce9565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316158061133257505f818152606a60205260409020546001600160a01b038481169116145b156113505760405163e0c897a760e01b815260040160405180910390fd5b6001600160a01b0383165f818152606b6020908152604080832080546001600160c01b031916905560a2825291829020805460ff1916905590519182527fc2ae0bd0ec0fd0352bfe5bacac49637af342c1e40f1b80a7f74440dc7fe3f063910160405180910390a1505050565b60685460ff16156113e157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031661140a5760405163dde3cda760e01b815260040160405180910390fd5b606f54611420906001600160a01b03168561274a565b61142e8686868686866120c3565b505050505050565b60a3546001600160a01b03163314611461576040516357b738d160e11b815260040160405180910390fd5b606d546001600160a01b031661148a57604051634cb4711360e11b815260040160405180910390fd5b606f80546001600160a01b0319166001600160a01b0384169081179091555f81815260a26020908152604091829020805460ff19168515159081179091558251938452908301527fc7318b7ed6ba4f2908a3de396d8ab49b1dadb55db5b55123247a401f29ff8d82910160405180910390a15050565b606061150b8261233d565b611514836123f8565b61151d846124ac565b60405160200161152f93929190613ed9565b6040516020818303038152906040529050919050565b5f8061155b600160201b63ffffffff8516613f3f565b61156b9063ffffffff8616613f56565b600881901c5f90815260696020526040902054600160ff9092169190911b90811614949350505050565b60685460ff16156115b957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115e9576040516302caf51760e11b815260040160405180910390fd5b61161c8c8c8c8c8c6116175f8e8e8e8e8e8e8e60405161160a929190613f69565b6040518091039020610906565b612867565b6001600160a01b03861661170357606f546001600160a01b03166116e7575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015611672576020820181803683370190505b506040516116809190613f78565b5f6040518083038185875af1925050503d805f81146116ba576040519150601f19603f3d011682016040523d82523d5f602084013e6116bf565b606091505b50509050806116e157604051630ce8f45160e31b815260040160405180910390fd5b5061192c565b606f546116fe906001600160a01b031685856127da565b61192c565b606d546001600160a01b0387811691161480156117315750606d5463ffffffff888116600160a01b90920416145b15611748575f6001600160a01b0385168482611648565b60685463ffffffff610100909104811690881603611774576116fe6001600160a01b03871685856129c5565b5f8787604051602001611788929190613ce9565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168061191e575f6117fd8386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506126a292505050565b905061180a8188886127da565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a838888604051611910959493929190613fbb565b60405180910390a150611929565b6119298187876127da565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156119ba57604051630bc011ff60e21b815260040160405180910390fd5b6119c2612a28565b60685463ffffffff6101009091048116908816036119f3576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816611ad657883414611a265760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611a5390613d13565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7f90613d13565b8015611aca5780601f10611aa157610100808354040283529160200191611aca565b820191905f5260205f20905b815481529060010190602001808311611aad57829003601f168201915b50505050509150611ca3565b3415611af55760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603611b1a57611b15888a61274a565b611ca3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015611b7957611b68898b61274a565b602081015181519095509350611c96565b8515611b8b57611b8b898b8989612a81565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf39190613ff3565b9050611c0a6001600160a01b038b1633308e612d32565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611c4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c729190613ff3565b9050611c7e828261400a565b6068548c9850610100900463ffffffff169650935050505b611c9f89611500565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611ce298979695949392919061401d565b60405180910390a1611d08611d035f85878f8f878980519060200120610906565b612d6a565b8615611d1657611d16612560565b50505050611d2360018055565b50505050505050565b60a3546001600160a01b03163314611d57576040516357b738d160e11b815260040160405180910390fd5b60a380546001600160a01b0319166001600160a01b0383169081179091556040519081527f32cf74f8a6d5f88593984d2cd52be5592bfa6884f5896175801a5069ef09cd679060200160405180910390a150565b60685460ff1615611dcf57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611dff576040516302caf51760e11b815260040160405180910390fd5b611e218c8c8c8c8c61161760018e8e8e8e8e8e8e60405161160a929190613f69565b606f545f906001600160a01b0316611ed457846001600160a01b031684888a8686604051602401611e559493929190614087565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611e8a9190613f78565b5f6040518083038185875af1925050503d805f8114611ec4576040519150601f19603f3d011682016040523d82523d5f602084013e611ec9565b606091505b505080915050611f85565b606f54611eeb906001600160a01b031686866127da565b846001600160a01b031687898585604051602401611f0c9493929190614087565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611f419190613f78565b5f604051808303815f865af19150503d805f8114611f7a576040519150601f19603f3d011682016040523d82523d5f602084013e611f7f565b606091505b50909150505b80611fa3576040516337e391c360e01b815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561202c57505f54600160ff909116105b806120455750303b15801561204557505f5460ff166001145b6120615760405162461bcd60e51b8152600401610da290613d8b565b5f805460ff191660011790558015612082575f805461ff0019166101001790555b60405163f57ac68360e01b815260040160405180910390fd5b60405180910390a150505050505050565b5f816120b9868686610bcf565b1495945050505050565b60685463ffffffff6101009091048116908716036120f4576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051612148999897969594939291906140c1565b60405180910390a161217f611d036001606860019054906101000a900463ffffffff16338a8a8a898960405161160a929190613f69565b821561142e5761142e612560565b6001600160a01b03831615806121aa57506001600160a01b038216155b156121c85760405163f6b2911f60e01b815260040160405180910390fd5b60685463ffffffff6101009091048116908516036121f95760405163658b23ad60e01b815260040160405180910390fd5b6001600160a01b038281165f908152606b6020526040902054600160201b90041615612238576040516317abdeeb60e21b815260040160405180910390fd5b5f848460405160200161224c929190613ce9565b60408051808303601f1901815282825280516020918201205f818152606a835283812080546001600160a01b0319166001600160a01b038a8116918217909255868601865263ffffffff8c81168089528c8416878a01818152848752606b89528987209a518b54915194166001600160c01b031990911617600160201b93909516929092029390931790975560a2855291859020805460ff191689151590811790915585519182529381019590955292840192909252606083015291507fdbe8a5da6a7a916d9adfda9160167a0f8a3da415ee6610e810e753853597fce79060800160405180910390a15050505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916123839190613f78565b5f60405180830381855afa9150503d805f81146123bb576040519150601f19603f3d011682016040523d82523d5f602084013e6123c0565b606091505b5091509150816123ef57604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610b85565b610b8581612e52565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169161243e9190613f78565b5f60405180830381855afa9150503d805f8114612476576040519150601f19603f3d011682016040523d82523d5f602084013e61247b565b606091505b5091509150816123ef57604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610b85565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916124f19190613f78565b5f60405180830381855afa9150503d805f8114612529576040519150601f19603f3d011682016040523d82523d5f602084013e61252e565b606091505b5091509150818015612541575080516020145b61254c576012610b85565b80806020019051810190610b85919061412d565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6125a7610a88565b6040518263ffffffff1660e01b81526004016125c591815260200190565b5f604051808303815f87803b1580156125dc575f80fd5b505af11580156125ee573d5f803e3d5ffd5b50505050565b5f612609600160201b63ffffffff8416613f3f565b6126199063ffffffff8516613f56565b600881901c5f8181526069602052604090208054600160ff851690811b91821892839055939450919291908082161561266557604051630631b5f760e31b815260040160405180910390fd5b6040805163ffffffff808a168252881660208201527f4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a910161209b565b5f8060405180611ba00160405280611b668152602001614460611b669139836040516020016126d2929190613f11565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612715576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b5f54610100900460ff166127425760405162461bcd60e51b8152600401610da290614148565b610bae612fdb565b6001600160a01b0382165f90815260a2602052604090205460ff16156127835761277f6001600160a01b038316333084612d32565b5050565b604051632770a7eb60e21b8152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b1580156127c8575f80fd5b505af115801561142e573d5f803e3d5ffd5b6001600160a01b0383165f90815260a2602052604090205460ff161561280e57610d4a6001600160a01b03841683836129c5565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b158015612855575f80fd5b505af1158015611d23573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af11580156128dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129019190613ff3565b9050805f0361292257604051622f6fad60e01b815260040160405180910390fd5b5f806801000000000000000087161561296657869150612944848a84896120ac565b612961576040516338105f3b60e21b815260040160405180910390fd5b6129b0565b602087901c612976816001614193565b9150879250612991612989868c86610bcf565b8a83896120ac565b6129ae576040516338105f3b60e21b815260040160405180910390fd5b505b6129ba8282613001565b505050505050505050565b6040516001600160a01b038316602482015260448101829052610d4a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613073565b600260015403612a7a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610da2565b6002600155565b5f612a8f60048284866141b0565b612a98916141d7565b9050632afa533160e01b6001600160e01b0319821601612bcc575f808080808080612ac6896004818d6141b0565b810190612ad39190614207565b96509650965096509650965096508a8514612b01576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691612b7f9190613f78565b5f604051808303815f865af19150503d805f8114612bb8576040519150601f19603f3d011682016040523d82523d5f602084013e612bbd565b606091505b50505050505050505050610873565b6001600160e01b031981166323f2ebc360e21b14612bfd57604051637141605d60e11b815260040160405180910390fd5b5f80808080808080612c128a6004818e6141b0565b810190612c1f9190614256565b975097509750975097509750975097508c6001600160a01b0316638fcbaf0c60e01b8989898989898989604051602401612ca49897969594939291906001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612ce29190613f78565b5f604051808303815f865af19150503d805f8114612d1b576040519150601f19603f3d011682016040523d82523d5f602084013e612d20565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125ee9085906323b872dd60e01b906084016129f1565b806001612d79602060026143b4565b612d83919061400a565b60535410612da4576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154612db390613d73565b918290555090505f5b6020811015612e43578082901c600116600103612def578260338260208110612de757612de7613d4b565b015550505050565b60338160208110612e0257612e02613d4b565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612e3b90613d73565b915050612dbc565b50610d4a6143bf565b60018055565b60606040825110612e71578180602001905181019061080491906143d3565b8151602003612fa8575f5b602081108015612eab5750828181518110612e9957612e99613d4b565b01602001516001600160f81b03191615155b15612ec25780612eba81613d73565b915050612e7c565b805f03612ef95750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115612f1257612f12613490565b6040519080825280601f01601f191660200182016040528015612f3c576020820181803683370190505b5090505f5b82811015612fa057848181518110612f5b57612f5b613d4b565b602001015160f81c60f81b828281518110612f7857612f78613d4b565b60200101906001600160f81b03191690815f1a90535080612f9881613d73565b915050612f41565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16612e4c5760405162461bcd60e51b8152600401610da290614148565b5f613016600160201b63ffffffff8416613f3f565b6130269063ffffffff8516613f56565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055949550929392918183169003611d2357604051630c8d9eab60e31b815260040160405180910390fd5b5f6130c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131469092919063ffffffff16565b905080515f14806130e75750808060200190518101906130e79190614444565b610d4a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610da2565b6060610b8584845f85855f80866001600160a01b0316858760405161316b9190613f78565b5f6040518083038185875af1925050503d805f81146131a5576040519150601f19603f3d011682016040523d82523d5f602084013e6131aa565b606091505b50915091506131bb878383876131c6565b979650505050505050565b606083156132345782515f0361322d576001600160a01b0385163b61322d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da2565b5081610b85565b610b8583838151156132495781518083602001fd5b8060405162461bcd60e51b8152600401610da291906133d4565b803563ffffffff81168114612fd6575f80fd5b6001600160a01b038116811461328a575f80fd5b50565b5f806040838503121561329e575f80fd5b6132a783613263565b915060208301356132b781613276565b809150509250929050565b801515811461328a575f80fd5b5f8083601f8401126132df575f80fd5b5081356001600160401b038111156132f5575f80fd5b60208301915083602082850101111561330c575f80fd5b9250929050565b5f805f805f60808688031215613327575f80fd5b61333086613263565b9450602086013561334081613276565b93506040860135613350816132c2565b925060608601356001600160401b0381111561336a575f80fd5b613376888289016132cf565b969995985093965092949392505050565b5f5b838110156133a1578181015183820152602001613389565b50505f910152565b5f81518084526133c0816020860160208601613387565b601f01601f19169290920160200192915050565b602081525f6133e660208301846133a9565b9392505050565b5f602082840312156133fd575f80fd5b81356133e681613276565b60ff8116811461328a575f80fd5b5f805f805f805f60e0888a03121561342c575f80fd5b873561343781613408565b965061344560208901613263565b9550604088013561345581613276565b945061346360608901613263565b9350608088013561347381613276565b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156134cc576134cc613490565b604052919050565b5f6001600160401b038211156134ec576134ec613490565b5060051b60200190565b5f82601f830112613505575f80fd5b8135602061351a613515836134d4565b6134a4565b82815260059290921b84018101918181019086841115613538575f80fd5b8286015b8481101561355a5761354d81613263565b835291830191830161353c565b509695505050505050565b5f82601f830112613574575f80fd5b81356020613584613515836134d4565b82815260059290921b840181019181810190868411156135a2575f80fd5b8286015b8481101561355a5780356135b981613276565b83529183019183016135a6565b5f805f80608085870312156135d9575f80fd5b84356001600160401b03808211156135ef575f80fd5b6135fb888389016134f6565b9550602091508187013581811115613611575f80fd5b61361d89828a01613565565b955050604087013581811115613631575f80fd5b61363d89828a01613565565b945050606087013581811115613651575f80fd5b87019050601f81018813613663575f80fd5b8035613671613515826134d4565b81815260059190911b8201830190838101908a83111561368f575f80fd5b928401925b828410156136b65783356136a7816132c2565b82529284019290840190613694565b979a9699509497505050505050565b5f805f606084860312156136d7575f80fd5b6136e084613263565b925060208401356136f081613276565b9150604084013561370081613276565b809150509250925092565b5f6020828403121561371b575f80fd5b5035919050565b806104008101831015610804575f80fd5b5f805f6104408486031215613746575f80fd5b833592506137578560208601613722565b91506137666104208501613263565b90509250925092565b5f8060408385031215613780575f80fd5b82356001600160401b0380821115613796575f80fd5b6137a2868387016134f6565b935060208501359150808211156137b7575f80fd5b506137c4858286016134f6565b9150509250929050565b5f6001600160401b038211156137e6576137e6613490565b50601f01601f191660200190565b5f82601f830112613803575f80fd5b8135613811613515826137ce565b818152846020838601011115613825575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f805f6101208a8c03121561385a575f80fd5b6138638a613263565b985060208a013561387381613276565b975061388160408b01613263565b965060608a013561389181613276565b955060808a01356138a181613276565b945060a08a01356001600160401b038111156138bb575f80fd5b6138c78c828d016137f4565b94505060c08a01356138d881613276565b925060e08a01356138e881613276565b91506101008a01356138f9816132c2565b809150509295985092959850929598565b5f806040838503121561391b575f80fd5b823561392681613276565b946020939093013593505050565b5f805f805f60a08688031215613948575f80fd5b61395186613263565b9450602086013561396181613276565b935060408601356001600160401b038082111561397c575f80fd5b61398889838a016137f4565b9450606088013591508082111561399d575f80fd5b506139aa888289016137f4565b92505060808601356139bb81613408565b809150509295509295909350565b5f805f805f8060a087890312156139de575f80fd5b6139e787613263565b955060208701356139f781613276565b9450604087013593506060870135613a0e816132c2565b925060808701356001600160401b03811115613a28575f80fd5b613a3489828a016132cf565b979a9699509497509295939492505050565b5f8060408385031215613a57575f80fd5b8235613a6281613276565b915060208301356132b7816132c2565b5f8060408385031215613a83575f80fd5b613a8c83613263565b9150613a9a60208401613263565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613abf575f80fd5b613ac98e8e613722565b9b50613ad98e6104008f01613722565b9a506108008d013599506108208d013598506108408d01359750613b006108608e01613263565b9650613b106108808e0135613276565b6108808d01359550613b256108a08e01613263565b9450613b356108c08e0135613276565b6108c08d013593506108e08d013592506001600160401b036109008e01351115613b5d575f80fd5b613b6e8e6109008f01358f016132cf565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613b9c575f80fd5b613ba588613263565b96506020880135613bb581613276565b9550604088013594506060880135613bcc81613276565b93506080880135613bdc816132c2565b925060a08801356001600160401b03811115613bf6575f80fd5b613c028a828b016132cf565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613c2a575f80fd5b613c3387613263565b95506020870135613c4381613276565b9450613c5160408801613263565b93506060870135613c6181613276565b92506080870135613c7181613276565b915060a08701356001600160401b03811115613c8b575f80fd5b613c9789828a016137f4565b9150509295509295509295565b5f805f806104608587031215613cb8575f80fd5b84359350613cc98660208701613722565b9250613cd86104208601613263565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c90821680613d2757607f821691505b602082108103613d4557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613d8457613d84613d5f565b5060010190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115610d4a575f81815260208120601f850160051c81016020861015613dff5750805b601f850160051c820191505b8181101561142e57828155600101613e0b565b81516001600160401b03811115613e3757613e37613490565b613e4b81613e458454613d13565b84613dd9565b602080601f831160018114613e7e575f8415613e675750858301515b5f19600386901b1c1916600185901b17855561142e565b5f85815260208120601f198616915b82811015613eac57888601518255948401946001909101908401613e8d565b5085821015613ec957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613eeb60608301866133a9565b8281036020840152613efd81866133a9565b91505060ff83166040830152949350505050565b5f8351613f22818460208801613387565b835190830190613f36818360208801613387565b01949350505050565b808202811582820484141761080457610804613d5f565b8082018082111561080457610804613d5f565b818382375f9101908152919050565b5f8251613f89818460208701613387565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906131bb9083018486613f93565b5f60208284031215614003575f80fd5b5051919050565b8181038181111561080457610804613d5f565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161406e848301876133a9565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906140b79083018486613f93565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916141138483018789613f93565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561413d575f80fd5b81516133e681613408565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b63ffffffff81811683821601908082111561271557612715613d5f565b5f80858511156141be575f80fd5b838611156141ca575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156141ff5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121561421d575f80fd5b873561422881613276565b9650602088013561423881613276565b95506040880135945060608801359350608088013561347381613408565b5f805f805f805f80610100898b03121561426e575f80fd5b883561427981613276565b9750602089013561428981613276565b9650604089013595506060890135945060808901356142a7816132c2565b935060a08901356142b781613408565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561430e57815f19048211156142f4576142f4613d5f565b8085161561430157918102915b93841c93908002906142d9565b509250929050565b5f8261432457506001610804565b8161433057505f610804565b816001811461434657600281146143505761436c565b6001915050610804565b60ff84111561436157614361613d5f565b50506001821b610804565b5060208310610133831016604e8410600b841016171561438f575081810a610804565b61439983836142d4565b805f19048211156143ac576143ac613d5f565b029392505050565b5f6133e68383614316565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156143e3575f80fd5b81516001600160401b038111156143f8575f80fd5b8201601f81018413614408575f80fd5b8051614416613515826137ce565b81815285602083850101111561442a575f80fd5b61443b826020830160208601613387565b95945050505050565b5f60208284031215614454575f80fd5b81516133e6816132c256fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a264697066735822122037f2d9d14450b30ae5085e3e49ec180f0b199039dce098c7f027c2222e9455b264736f6c63430008140033 \ No newline at end of file diff --git a/etherman/smartcontracts/bin/globalexitrootmanagerl2sovereignchain.bin b/etherman/smartcontracts/bin/globalexitrootmanagerl2sovereignchain.bin index a02086ba..df0f7ebb 100644 --- a/etherman/smartcontracts/bin/globalexitrootmanagerl2sovereignchain.bin +++ b/etherman/smartcontracts/bin/globalexitrootmanagerl2sovereignchain.bin @@ -1 +1 @@ -60a060405234801562000010575f80fd5b5060405162000f9838038062000f988339818101604052810190620000369190620001af565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200007c6200008360201b60201c565b50620002bb565b603460019054906101000a900460ff1615620000d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000cd9062000263565b60405180910390fd5b60ff801660345f9054906101000a900460ff1660ff1614620001485760ff60345f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516200013f9190620002a0565b60405180910390a15b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000179826200014e565b9050919050565b6200018b816200016d565b811462000196575f80fd5b50565b5f81519050620001a98162000180565b92915050565b5f60208284031215620001c757620001c66200014a565b5b5f620001d68482850162000199565b91505092915050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f6200024b602783620001df565b91506200025882620001ef565b604082019050919050565b5f6020820190508181035f8301526200027c816200023d565b9050919050565b5f60ff82169050919050565b6200029a8162000283565b82525050565b5f602082019050620002b55f8301846200028f565b92915050565b608051610cbd620002db5f395f81816103b601526106e40152610cbd5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c806357dfb5721161006457806357dfb5721461011b5780637c314ce3146101375780638bd0eb1c14610155578063a3c573eb14610173578063c4d66de81461019157610091565b806301fd90441461009557806312da06b2146100b3578063257b3632146100cf57806333d6247d146100ff575b5f80fd5b61009d6101ad565b6040516100aa91906108ba565b60405180910390f35b6100cd60048036038101906100c89190610905565b6101b3565b005b6100e960048036038101906100e49190610905565b6103a0565b6040516100f69190610948565b60405180910390f35b61011960048036038101906101149190610905565b6103b4565b005b610135600480360381019061013091906109c2565b610443565b005b61013f6106b6565b60405161014c9190610a4c565b60405180910390f35b61015d6106dc565b60405161016a9190610948565b60405180910390f35b61017b6106e2565b6040516101889190610a4c565b60405180910390f35b6101ab60048036038101906101a69190610a8f565b610706565b005b60015481565b5f73ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610272573373ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff161461026d576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102fa565b3373ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f9576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f805f8381526020019081526020015f20540361036b5760355f815461031f90610ae7565b9190508190555f808381526020019081526020015f2081905550807fb1b866fe5fac68e8f1a4ab2520c7a6b493a954934bbd0f054bd91d6674a4c0d560405160405180910390a261039d565b6040517f1f97a58200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f602052805f5260405f205f915090505481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610439576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050565b5f73ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610502573373ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff16146104fd576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61058a565b3373ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610589576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f6035549050808383905011156105cd576040517f56feb4f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838390508110156106b0575f8484838181106105ee576105ed610b2e565b5b9050602002013590505f805f8381526020019081526020015f20549050838114610644576040517fae765ff600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808381526020019081526020015f205f905560355f81548092919061066990610b5b565b9190505550817f605764d0b65b62ecf05dc90f674a00a2e2531fabaf120fdde65790e407fcb7a260405160405180910390a2505080806106a890610ae7565b9150506105cf565b50505050565b603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60355481565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f603460019054906101000a900460ff161590508080156107385750600160345f9054906101000a900460ff1660ff16105b80610766575061074730610880565b1580156107655750600160345f9054906101000a900460ff1660ff16145b5b6107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c90610c02565b60405180910390fd5b600160345f6101000a81548160ff021916908360ff16021790555080156107e2576001603460016101000a81548160ff0219169083151502179055505b81603460026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550801561087c575f603460016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516108739190610c6e565b60405180910390a15b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f819050919050565b6108b4816108a2565b82525050565b5f6020820190506108cd5f8301846108ab565b92915050565b5f80fd5b5f80fd5b6108e4816108a2565b81146108ee575f80fd5b50565b5f813590506108ff816108db565b92915050565b5f6020828403121561091a576109196108d3565b5b5f610927848285016108f1565b91505092915050565b5f819050919050565b61094281610930565b82525050565b5f60208201905061095b5f830184610939565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261098257610981610961565b5b8235905067ffffffffffffffff81111561099f5761099e610965565b5b6020830191508360208202830111156109bb576109ba610969565b5b9250929050565b5f80602083850312156109d8576109d76108d3565b5b5f83013567ffffffffffffffff8111156109f5576109f46108d7565b5b610a018582860161096d565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a3682610a0d565b9050919050565b610a4681610a2c565b82525050565b5f602082019050610a5f5f830184610a3d565b92915050565b610a6e81610a2c565b8114610a78575f80fd5b50565b5f81359050610a8981610a65565b92915050565b5f60208284031215610aa457610aa36108d3565b5b5f610ab184828501610a7b565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610af182610930565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610b2357610b22610aba565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f610b6582610930565b91505f8203610b7757610b76610aba565b5b600182039050919050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f610bec602e83610b82565b9150610bf782610b92565b604082019050919050565b5f6020820190508181035f830152610c1981610be0565b9050919050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f610c58610c53610c4e84610c20565b610c35565b610c29565b9050919050565b610c6881610c3e565b82525050565b5f602082019050610c815f830184610c5f565b9291505056fea264697066735822122074d4b5710dd22e5484705695828b56da48cad4b79877dd7ffc8ab8c31a8f171e64736f6c63430008140033 \ No newline at end of file +60a060405234801561000f575f80fd5b5060405161096d38038061096d83398101604081905261002e91610108565b6001600160a01b038116608052610043610049565b50610135565b603454610100900460ff16156100b55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60345460ff90811614610106576034805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610118575f80fd5b81516001600160a01b038116811461012e575f80fd5b9392505050565b6080516108196101545f395f81816101a301526102cb01526108195ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c80636da0e4ab1161006e5780636da0e4ab1461013e5780637c314ce3146101515780638bd0eb1c1461018257806391eb796d1461018b578063a3c573eb1461019e578063d0267f39146101c5575f80fd5b806301fd9044146100b557806312da06b2146100d1578063257b3632146100e657806333d6247d14610105578063485cc9551461011857806357dfb5721461012b575b5f80fd5b6100be60015481565b6040519081526020015b60405180910390f35b6100e46100df36600461069c565b6101d8565b005b6100be6100f436600461069c565b5f6020819052908152604090205481565b6100e461011336600461069c565b6102c0565b6100e46101263660046106ce565b61030e565b6100e46101393660046106ff565b61045e565b6100e461014c36600461076e565b61056a565b60345461016a906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016100c8565b6100be60365481565b60355461016a906001600160a01b031681565b61016a7f000000000000000000000000000000000000000000000000000000000000000081565b6100e46101d336600461076e565b610629565b6034546201000090046001600160a01b03166102135741331461020e576040516363ac7e0d60e11b815260040160405180910390fd5b610244565b6034546201000090046001600160a01b03163314610244576040516363ac7e0d60e11b815260040160405180910390fd5b5f8181526020819052604081205490036102a75760365f8154610266906107a2565b91829055505f8281526020819052604080822092909255905182917fb1b866fe5fac68e8f1a4ab2520c7a6b493a954934bbd0f054bd91d6674a4c0d591a250565b604051630fcbd2c160e11b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103095760405163b49365dd60e01b815260040160405180910390fd5b600155565b603454610100900460ff161580801561032e5750603454600160ff909116105b806103485750303b158015610348575060345460ff166001145b6103af5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6034805460ff1916600117905580156103d2576034805461ff0019166101001790555b6034805462010000600160b01b031916620100006001600160a01b038681169190910291909117909155603580546001600160a01b0319169184169190911790558015610459576034805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6035546001600160a01b031633146104895760405163a34ddeb160e01b815260040160405180910390fd5b603654808211156104ad576040516356feb4f560e01b815260040160405180910390fd5b5f5b82811015610562575f8484838181106104ca576104ca6107ba565b9050602002013590505f805f8381526020019081526020015f205490508381146105075760405163573b2ffb60e11b815260040160405180910390fd5b5f828152602081905260408120558361051f816107ce565b6040519095508391507f605764d0b65b62ecf05dc90f674a00a2e2531fabaf120fdde65790e407fcb7a2905f90a25050808061055a906107a2565b9150506104af565b506036555050565b6034546201000090046001600160a01b03166105a5574133146105a0576040516363ac7e0d60e11b815260040160405180910390fd5b6105d6565b6034546201000090046001600160a01b031633146105d6576040516363ac7e0d60e11b815260040160405180910390fd5b6034805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c905f90a250565b6035546001600160a01b031633146106545760405163a34ddeb160e01b815260040160405180910390fd5b603580546001600160a01b0319166001600160a01b0383169081179091556040517eb4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758905f90a250565b5f602082840312156106ac575f80fd5b5035919050565b80356001600160a01b03811681146106c9575f80fd5b919050565b5f80604083850312156106df575f80fd5b6106e8836106b3565b91506106f6602084016106b3565b90509250929050565b5f8060208385031215610710575f80fd5b823567ffffffffffffffff80821115610727575f80fd5b818501915085601f83011261073a575f80fd5b813581811115610748575f80fd5b8660208260051b850101111561075c575f80fd5b60209290920196919550909350505050565b5f6020828403121561077e575f80fd5b610787826106b3565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016107b3576107b361078e565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f816107dc576107dc61078e565b505f19019056fea264697066735822122028489e152b03d240177e44e3649d90f4b6305fd1183026889eb37073f90b4c3864736f6c63430008140033 \ No newline at end of file diff --git a/etherman/smartcontracts/bin/polygonzkevmbridgev2.bin b/etherman/smartcontracts/bin/polygonzkevmbridgev2.bin new file mode 100644 index 00000000..c4a3c817 --- /dev/null +++ b/etherman/smartcontracts/bin/polygonzkevmbridgev2.bin @@ -0,0 +1 @@ +608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61539c80620000ed5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a7578063f5efcd79146105d2578063f811bff7146105f1578063fb57083414610610575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610593575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b5061022161062f565b005b34801561022e575f80fd5b5061024261023d3660046129c1565b610664565b6040516001600160a01b039091168152602001610204565b610221610268366004612a48565b6106b2565b348015610278575f80fd5b50610281610722565b6040516102049190612b0a565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb366004612b23565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004612b4c565b6107ae565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361083a565b3480156103cd575f80fd5b506102426103dc366004612bc6565b610916565b3480156103ec575f80fd5b5061022161093f565b348015610400575f80fd5b5061024261040f366004612c0c565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b50610281610960565b348015610448575f80fd5b506102a3610457366004612c34565b61097f565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b50610242610495366004612d35565b610a54565b3480156104a5575f80fd5b506102216104b4366004612dcb565b610b54565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b50610281610517366004612b23565b610bcd565b348015610527575f80fd5b506101f8610536366004612e49565b610c12565b348015610546575f80fd5b50610221610555366004612e7a565b610c9a565b610221610568366004612f5e565b61109b565b348015610578575f80fd5b5060685461024290600160281b90046001600160a01b031681565b34801561059e575f80fd5b50610221611432565b3480156105b2575f80fd5b506102a36105c1366004612c0c565b60696020525f908152604090205481565b3480156105dd575f80fd5b506102216105ec366004612e7a565b611465565b3480156105fc575f80fd5b5061022161060b366004612fee565b6116c8565b34801561061b575f80fd5b506101f861062a366004613091565b611934565b606c546001600160a01b0316331461065a57604051631736745960e31b815260040160405180910390fd5b61066261194b565b565b5f606a5f848460405160200161067b9291906130d6565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156106d657604051630bc011ff60e21b815260040160405180910390fd5b34158015906106ef5750606f546001600160a01b031615155b1561070d576040516301bd897160e61b815260040160405180910390fd5b61071b8585348686866119a6565b5050505050565b606e805461072f90613100565b80601f016020809104026020016040519081016040528092919081815260200182805461075b90613100565b80156107a65780601f1061077d576101008083540402835291602001916107a6565b820191905f5260205f20905b81548152906001019060200180831161078957829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b602081101561090d578083901c6001166001036108a1576033816020811061086e5761086e613138565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108ce565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061090590613160565b915050610844565b50919392505050565b5f610937848461092585611a70565b61092e86611b2b565b61049587611bdf565b949350505050565b605354606854600160c81b900463ffffffff16101561066257610662611c93565b60405180611ba00160405280611b668152602001613801611b66913981565b5f83815b6020811015610a4b57600163ffffffff8516821c811690036109ee578481602081106109b1576109b1613138565b6020020135826040516020016109d1929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a39565b81858260208110610a0157610a01613138565b6020020135604051602001610a20929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a4381613160565b915050610983565b50949350505050565b5f808686604051602001610a699291906130d6565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613801611b669139898989604051602001610aba93929190613178565b60408051601f1981840301815290829052610ad892916020016131b0565b60405160208183030381529060405280519060200120604051602001610b3094939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b7857604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610ba15760405163dde3cda760e01b815260040160405180910390fd5b606f54610bb7906001600160a01b031685611d27565b610bc58686868686866119a6565b505050505050565b6060610bd882611a70565b610be183611b2b565b610bea84611bdf565b604051602001610bfc93929190613178565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610c37575063ffffffff83166001145b15610c49575063ffffffff8316610c71565b610c5e64010000000063ffffffff85166131de565b610c6e9063ffffffff86166131f5565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cbe57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610cee576040516302caf51760e11b815260040160405180910390fd5b610d218c8c8c8c8c610d1c5f8e8e8e8e8e8e8e604051610d0f929190613208565b60405180910390206107ae565b611d7e565b6001600160a01b038616610e0857606f546001600160a01b0316610dec575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610d77576020820181803683370190505b50604051610d859190613217565b5f6040518083038185875af1925050503d805f8114610dbf576040519150601f19603f3d011682016040523d82523d5f602084013e610dc4565b606091505b5050905080610de657604051630ce8f45160e31b815260040160405180910390fd5b50611031565b606f54610e03906001600160a01b03168585611edc565b611031565b606d546001600160a01b038781169116148015610e365750606d5463ffffffff888116600160a01b90920416145b15610e4d575f6001600160a01b0385168482610d4d565b60685463ffffffff610100909104811690881603610e7957610e036001600160a01b0387168585611f35565b5f8787604051602001610e8d9291906130d6565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680611023575f610f028386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f9d92505050565b9050610f0f818888611edc565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a83888860405161101595949392919061325a565b60405180910390a15061102e565b61102e818787611edc565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156110bf57604051630bc011ff60e21b815260040160405180910390fd5b6110c7612017565b60685463ffffffff6101009091048116908816036110f8576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166111db5788341461112b5760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061115890613100565b80601f016020809104026020016040519081016040528092919081815260200182805461118490613100565b80156111cf5780601f106111a6576101008083540402835291602001916111cf565b820191905f5260205f20905b8154815290600101906020018083116111b257829003601f168201915b505050505091506113a9565b34156111fa5760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b039081169089160361121f5761121a888a611d27565b6113a9565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561127f5761126e898b611d27565b60208101518151909550935061139c565b851561129157611291898b8989612070565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156112d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f99190613292565b90506113106001600160a01b038b1633308e6123ab565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113789190613292565b905061138482826132a9565b6068548c9850610100900463ffffffff169650935050505b6113a589610bcd565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516113e89897969594939291906132bc565b60405180910390a161140e6114095f85878f8f8789805190602001206107ae565b6123e3565b861561141c5761141c611c93565b5050505061142960018055565b50505050505050565b606c546001600160a01b0316331461145d57604051631736745960e31b815260040160405180910390fd5b6106626124cb565b60685460ff161561148957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146114b9576040516302caf51760e11b815260040160405180910390fd5b6114db8c8c8c8c8c610d1c60018e8e8e8e8e8e8e604051610d0f929190613208565b606f545f906001600160a01b031661158e57846001600160a01b031684888a868660405160240161150f9493929190613326565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516115449190613217565b5f6040518083038185875af1925050503d805f811461157e576040519150601f19603f3d011682016040523d82523d5f602084013e611583565b606091505b50508091505061163f565b606f546115a5906001600160a01b03168686611edc565b846001600160a01b0316878985856040516024016115c69493929190613326565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516115fb9190613217565b5f604051808303815f865af19150503d805f8114611634576040519150601f19603f3d011682016040523d82523d5f602084013e611639565b606091505b50909150505b8061165d576040516337e391c360e01b815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff16158080156116e657505f54600160ff909116105b806116ff5750303b1580156116ff57505f5460ff166001145b6117675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611788575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b03191685831617905586166118115763ffffffff85161561180c57604051630d43a60960e11b815260040160405180910390fd5b6118df565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e61184883826133a5565b506118be5f801b60126040516020016118aa91906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052611f9d565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b6118e7612522565b8015611429575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f8161194186868661097f565b1495945050505050565b60685460ff161561196f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff6101009091048116908716036119d7576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611a2b99989796959493929190613461565b60405180910390a1611a626114096001606860019054906101000a900463ffffffff16338a8a8a8989604051610d0f929190613208565b8215610bc557610bc5611c93565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b03861691611ab69190613217565b5f60405180830381855afa9150503d805f8114611aee576040519150601f19603f3d011682016040523d82523d5f602084013e611af3565b606091505b509150915081611b2257604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610937565b61093781612550565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b03861691611b719190613217565b5f60405180830381855afa9150503d805f8114611ba9576040519150601f19603f3d011682016040523d82523d5f602084013e611bae565b606091505b509150915081611b2257604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610937565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691611c249190613217565b5f60405180830381855afa9150503d805f8114611c5c576040519150601f19603f3d011682016040523d82523d5f602084013e611c61565b606091505b5091509150818015611c74575080516020145b611c7f576012610937565b8080602001905181019061093791906134cd565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611cda61083a565b6040518263ffffffff1660e01b8152600401611cf891815260200190565b5f604051808303815f87803b158015611d0f575f80fd5b505af1158015611d21573d5f803e3d5ffd5b50505050565b604051632770a7eb60e21b8152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b158015611d6c575f80fd5b505af1158015610bc5573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af1158015611df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e189190613292565b9050805f03611e3957604051622f6fad60e01b815260040160405180910390fd5b5f8068010000000000000000871615611e7d57869150611e5b848a8489611934565b611e78576040516338105f3b60e21b815260040160405180910390fd5b611ec7565b602087901c611e8d8160016134e8565b9150879250611ea8611ea0868c8661097f565b8a8389611934565b611ec5576040516338105f3b60e21b815260040160405180910390fd5b505b611ed182826126da565b505050505050505050565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b158015611f23575f80fd5b505af1158015611429573d5f803e3d5ffd5b6040516001600160a01b038316602482015260448101829052611f9890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612781565b505050565b5f8060405180611ba00160405280611b668152602001613801611b66913983604051602001611fcd9291906131b0565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612010576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036120695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161175e565b6002600155565b5f61207e6004828486613505565b6120879161352c565b9050632afa533160e01b6001600160e01b0319821601612216575f8080808080806120b5896004818d613505565b8101906120c2919061355c565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146121025760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301461212b5760405163750643af60e01b815260040160405180910390fd5b8a851461214b576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916121c99190613217565b5f604051808303815f865af19150503d805f8114612202576040519150601f19603f3d011682016040523d82523d5f602084013e612207565b606091505b5050505050505050505061071b565b6001600160e01b031981166323f2ebc360e21b1461224757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808061225c8a6004818e613505565b81019061226991906135ab565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146122ab5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146122d45760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161235b9190613217565b5f604051808303815f865af19150503d805f8114612394576040519150601f19603f3d011682016040523d82523d5f602084013e612399565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611d219085906323b872dd60e01b90608401611f61565b8060016123f260206002613709565b6123fc91906132a9565b6053541061241d576040516377ae67b360e11b815260040160405180910390fd5b5f60535f815461242c90613160565b918290555090505f5b60208110156124bc578082901c60011660010361246857826033826020811061246057612460613138565b015550505050565b6033816020811061247b5761247b613138565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806124b490613160565b915050612435565b50611f98613714565b60018055565b60685460ff166124ee57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff166125485760405162461bcd60e51b815260040161175e90613728565b610662612854565b6060604082511061256f57818060200190518101906106ac9190613773565b81516020036126a7575f5b6020811080156125a9575082818151811061259757612597613138565b01602001516001600160f81b03191615155b156125c057806125b881613160565b91505061257a565b805f036125f75750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f8167ffffffffffffffff81111561261157612611612c70565b6040519080825280601f01601f19166020018201604052801561263b576020820181803683370190505b5090505f5b8281101561269f5784818151811061265a5761265a613138565b602001015160f81c60f81b82828151811061267757612677613138565b60200101906001600160f81b03191690815f1a9053508061269781613160565b915050612640565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b6068545f90610100900463ffffffff161580156126fd575063ffffffff82166001145b1561270f575063ffffffff8216612737565b61272464010000000063ffffffff84166131de565b6127349063ffffffff85166131f5565b90505b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900361142957604051630c8d9eab60e31b815260040160405180910390fd5b5f6127d5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661287a9092919063ffffffff16565b905080515f14806127f55750808060200190518101906127f591906137e5565b611f985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161175e565b5f54610100900460ff166124c55760405162461bcd60e51b815260040161175e90613728565b606061093784845f85855f80866001600160a01b0316858760405161289f9190613217565b5f6040518083038185875af1925050503d805f81146128d9576040519150601f19603f3d011682016040523d82523d5f602084013e6128de565b606091505b50915091506128ef878383876128fa565b979650505050505050565b606083156129685782515f03612961576001600160a01b0385163b6129615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161175e565b5081610937565b610937838381511561297d5781518083602001fd5b8060405162461bcd60e51b815260040161175e9190612b0a565b803563ffffffff811681146126d5575f80fd5b6001600160a01b03811681146129be575f80fd5b50565b5f80604083850312156129d2575f80fd5b6129db83612997565b915060208301356129eb816129aa565b809150509250929050565b80151581146129be575f80fd5b5f8083601f840112612a13575f80fd5b50813567ffffffffffffffff811115612a2a575f80fd5b602083019150836020828501011115612a41575f80fd5b9250929050565b5f805f805f60808688031215612a5c575f80fd5b612a6586612997565b94506020860135612a75816129aa565b93506040860135612a85816129f6565b9250606086013567ffffffffffffffff811115612aa0575f80fd5b612aac88828901612a03565b969995985093965092949392505050565b5f5b83811015612ad7578181015183820152602001612abf565b50505f910152565b5f8151808452612af6816020860160208601612abd565b601f01601f19169290920160200192915050565b602081525f612b1c6020830184612adf565b9392505050565b5f60208284031215612b33575f80fd5b8135612b1c816129aa565b60ff811681146129be575f80fd5b5f805f805f805f60e0888a031215612b62575f80fd5b8735612b6d81612b3e565b9650612b7b60208901612997565b95506040880135612b8b816129aa565b9450612b9960608901612997565b93506080880135612ba9816129aa565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215612bd8575f80fd5b612be184612997565b92506020840135612bf1816129aa565b91506040840135612c01816129aa565b809150509250925092565b5f60208284031215612c1c575f80fd5b5035919050565b8061040081018310156106ac575f80fd5b5f805f6104408486031215612c47575f80fd5b83359250612c588560208601612c23565b9150612c676104208501612997565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cad57612cad612c70565b604052919050565b5f67ffffffffffffffff821115612cce57612cce612c70565b50601f01601f191660200190565b5f612cee612ce984612cb5565b612c84565b9050828152838383011115612d01575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612d26575f80fd5b612b1c83833560208501612cdc565b5f805f805f60a08688031215612d49575f80fd5b612d5286612997565b94506020860135612d62816129aa565b9350604086013567ffffffffffffffff80821115612d7e575f80fd5b612d8a89838a01612d17565b94506060880135915080821115612d9f575f80fd5b50612dac88828901612d17565b9250506080860135612dbd81612b3e565b809150509295509295909350565b5f805f805f8060a08789031215612de0575f80fd5b612de987612997565b95506020870135612df9816129aa565b9450604087013593506060870135612e10816129f6565b9250608087013567ffffffffffffffff811115612e2b575f80fd5b612e3789828a01612a03565b979a9699509497509295939492505050565b5f8060408385031215612e5a575f80fd5b612e6383612997565b9150612e7160208401612997565b90509250929050565b5f805f805f805f805f805f806109208d8f031215612e96575f80fd5b612ea08e8e612c23565b9b50612eb08e6104008f01612c23565b9a506108008d013599506108208d013598506108408d01359750612ed76108608e01612997565b9650612ee76108808e01356129aa565b6108808d01359550612efc6108a08e01612997565b9450612f0c6108c08e01356129aa565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e01351115612f35575f80fd5b612f468e6109008f01358f01612a03565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215612f74575f80fd5b612f7d88612997565b96506020880135612f8d816129aa565b9550604088013594506060880135612fa4816129aa565b93506080880135612fb4816129f6565b925060a088013567ffffffffffffffff811115612fcf575f80fd5b612fdb8a828b01612a03565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613003575f80fd5b61300c87612997565b9550602087013561301c816129aa565b945061302a60408801612997565b9350606087013561303a816129aa565b9250608087013561304a816129aa565b915060a087013567ffffffffffffffff811115613065575f80fd5b8701601f81018913613075575f80fd5b61308489823560208401612cdc565b9150509295509295509295565b5f805f8061046085870312156130a5575f80fd5b843593506130b68660208701612c23565b92506130c56104208601612997565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061311457607f821691505b60208210810361313257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016131715761317161314c565b5060010190565b606081525f61318a6060830186612adf565b828103602084015261319c8186612adf565b91505060ff83166040830152949350505050565b5f83516131c1818460208801612abd565b8351908301906131d5818360208801612abd565b01949350505050565b80820281158282048414176106ac576106ac61314c565b808201808211156106ac576106ac61314c565b818382375f9101908152919050565b5f8251613228818460208701612abd565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906128ef9083018486613232565b5f602082840312156132a2575f80fd5b5051919050565b818103818111156106ac576106ac61314c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161330d84830187612adf565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906133569083018486613232565b9695505050505050565b601f821115611f98575f81815260208120601f850160051c810160208610156133865750805b601f850160051c820191505b81811015610bc557828155600101613392565b815167ffffffffffffffff8111156133bf576133bf612c70565b6133d3816133cd8454613100565b84613360565b602080601f831160018114613406575f84156133ef5750858301515b5f19600386901b1c1916600185901b178555610bc5565b5f85815260208120601f198616915b8281101561343457888601518255948401946001909101908401613415565b508582101561345157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916134b38483018789613232565b925080851660e085015250509a9950505050505050505050565b5f602082840312156134dd575f80fd5b8151612b1c81612b3e565b63ffffffff8181168382160190808211156120105761201061314c565b5f8085851115613513575f80fd5b8386111561351f575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156135545780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613572575f80fd5b873561357d816129aa565b9650602088013561358d816129aa565b955060408801359450606088013593506080880135612ba981612b3e565b5f805f805f805f80610100898b0312156135c3575f80fd5b88356135ce816129aa565b975060208901356135de816129aa565b9650604089013595506060890135945060808901356135fc816129f6565b935060a089013561360c81612b3e565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561366357815f19048211156136495761364961314c565b8085161561365657918102915b93841c939080029061362e565b509250929050565b5f82613679575060016106ac565b8161368557505f6106ac565b816001811461369b57600281146136a5576136c1565b60019150506106ac565b60ff8411156136b6576136b661314c565b50506001821b6106ac565b5060208310610133831016604e8410600b84101617156136e4575081810a6106ac565b6136ee8383613629565b805f19048211156137015761370161314c565b029392505050565b5f612b1c838361366b565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215613783575f80fd5b815167ffffffffffffffff811115613799575f80fd5b8201601f810184136137a9575f80fd5b80516137b7612ce982612cb5565b8181528560208385010111156137cb575f80fd5b6137dc826020830160208601612abd565b95945050505050565b5f602082840312156137f5575f80fd5b8151612b1c816129f656fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220f2a5cdf63dbf1cd3d440e3a4168a6977d8b149080d045c04198da4c5a4c8e22c64736f6c63430008140033 \ No newline at end of file diff --git a/etherman/smartcontracts/bridgel2sovereignchain/bridgel2sovereignchain.go b/etherman/smartcontracts/bridgel2sovereignchain/bridgel2sovereignchain.go index 26da240b..607407be 100644 --- a/etherman/smartcontracts/bridgel2sovereignchain/bridgel2sovereignchain.go +++ b/etherman/smartcontracts/bridgel2sovereignchain/bridgel2sovereignchain.go @@ -31,8 +31,8 @@ var ( // Bridgel2sovereignchainMetaData contains all meta data concerning the Bridgel2sovereignchain contract. var Bridgel2sovereignchainMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountDoesNotMatchMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DestinationNetworkInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EtherTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedTokenWrappedDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasTokenNetworkMustBeZeroOnEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InputArraysLengthMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializeFunction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSmtProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSovereignWETHAddressParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MerkleTreeFull\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MsgValueNotZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeTokenIsEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoValueInMessagesOnGasTokenNetworks\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidBridgeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBridgeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyRollupManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OriginNetworkInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenAlreadyMapped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenAlreadyUpdated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenNotMapped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenNotRemapped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WETHRemappingNotSupportedOnGasTokenNetworks\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"depositCount\",\"type\":\"uint32\"}],\"name\":\"BridgeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"legacyTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"updatedTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"MigrateLegacyToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"NewWrappedToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sovereignTokenAddress\",\"type\":\"address\"}],\"name\":\"RemoveLegacySovereignTokenAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bridgeManager\",\"type\":\"address\"}],\"name\":\"SetBridgeManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sovereignTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"SetSovereignTokenAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sovereignWETHTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"SetSovereignWETHAddress\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_INIT_BYTECODE_WRAPPED_TOKEN\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WETHToken\",\"outputs\":[{\"internalType\":\"contractTokenWrapped\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"permitData\",\"type\":\"bytes\"}],\"name\":\"bridgeAsset\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountWETH\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessageWETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"}],\"name\":\"calculateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"calculateTokenWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimedBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenMetadata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenNetwork\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"name\":\"getLeafValue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenMetadata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"name\":\"getTokenWrappedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_networkID\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_gasTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_gasTokenNetwork\",\"type\":\"uint32\"},{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_polygonRollupManager\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_gasTokenMetadata\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_bridgeManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sovereignWETHAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_sovereignWETHAddressIsNotMintable\",\"type\":\"bool\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"leafIndex\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"sourceBridgeNetwork\",\"type\":\"uint32\"}],\"name\":\"isClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdatedDepositCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"legacyTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"migrateLegacyToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"polygonRollupManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"precalculatedWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sovereignTokenAddress\",\"type\":\"address\"}],\"name\":\"removeLegacySovereignTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridgeManager\",\"type\":\"address\"}],\"name\":\"setBridgeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"originNetworks\",\"type\":\"uint32[]\"},{\"internalType\":\"address[]\",\"name\":\"originTokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"sovereignTokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"isNotMintable\",\"type\":\"bool[]\"}],\"name\":\"setMultipleSovereignTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sovereignTokenAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"setSovereignTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sovereignWETHTokenAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"setSovereignWETHAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tokenInfoToWrappedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateGlobalExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedAddress\",\"type\":\"address\"}],\"name\":\"wrappedAddressIsNotMintable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokenToTokenInfo\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801562000010575f80fd5b506200001b6200002b565b620000256200002b565b620000e9565b5f54610100900460ff1615620000975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000e7575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615fe880620000f75f395ff3fe60806040526004361061023e575f3560e01c80638ed7e3f211610134578063c0f49163116100b3578063dbc1697611610078578063dbc16976146102a7578063eabd372a146106fc578063ee25560b1461071b578063f5efcd7914610746578063f811bff714610765578063fb57083414610784575f80fd5b8063c0f4916314610657578063cc46163214610685578063ccaa2d11146106a4578063cd586579146106c3578063d02103ca146106d6575f80fd5b8063b8b284d0116100f9578063b8b284d0146105b6578063bab161bf146105d5578063be5831c7146105f6578063bf130d7f14610619578063c00f14ab14610638575f80fd5b80638ed7e3f21461051b5780639e76158f1461053a578063aaa13cc214610559578063b42f6b3a14610578578063b458696214610597575f80fd5b80633e197043116101c057806379e2cf971161018557806379e2cf971461048157806381b1c1741461049557806383c43a55146104c957806383f24403146104dd5780638c0dd470146104fc575f80fd5b80633e197043146103f15780634b2f336d1461041057806357cfbee31461042f5780635ca1e1651461044e5780637843298b14610462575f80fd5b806327aef4e81161020657806327aef4e8146102ef5780632dfdf0b514610310578063318aee3d146103335780633c351e101461039a5780633cbc795b146103b9575f80fd5b806314cc01a01461024257806315064c961461027e5780632072f6c5146102a757806322e95f2c146102bd578063240ff378146102dc575b5f80fd5b34801561024d575f80fd5b5060a354610261906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610289575f80fd5b506068546102979060ff1681565b6040519015158152602001610275565b3480156102b2575f80fd5b506102bb6107a3565b005b3480156102c8575f80fd5b506102616102d7366004613280565b6107bc565b6102bb6102ea366004613306565b61080a565b3480156102fa575f80fd5b5061030361087a565b60405161027591906133c7565b34801561031b575f80fd5b5061032560535481565b604051908152602001610275565b34801561033e575f80fd5b5061037661034d3660046133e0565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610275565b3480156103a5575f80fd5b50606d54610261906001600160a01b031681565b3480156103c4575f80fd5b50606d546103dc90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610275565b3480156103fc575f80fd5b5061032561040b366004613409565b610906565b34801561041b575f80fd5b50606f54610261906001600160a01b031681565b34801561043a575f80fd5b506102bb6104493660046135bb565b610992565b348015610459575f80fd5b50610325610a88565b34801561046d575f80fd5b5061026161047c3660046136ba565b610b64565b34801561048c575f80fd5b506102bb610b8d565b3480156104a0575f80fd5b506102616104af366004613700565b606a6020525f90815260409020546001600160a01b031681565b3480156104d4575f80fd5b50610303610bb0565b3480156104e8575f80fd5b506103256104f7366004613728565b610bcf565b348015610507575f80fd5b506102bb6105163660046137d7565b610ca4565b348015610526575f80fd5b50606c54610261906001600160a01b031681565b348015610545575f80fd5b506102bb6105543660046138a0565b610f85565b348015610564575f80fd5b506102616105733660046138ca565b6110bd565b348015610583575f80fd5b506102bb61059236600461395f565b6111bd565b3480156105a2575f80fd5b506102bb6105b13660046133e0565b6111fa565b3480156105c1575f80fd5b506102bb6105d03660046139b6565b611354565b3480156105e0575f80fd5b506068546103dc90610100900463ffffffff1681565b348015610601575f80fd5b506068546103dc90600160c81b900463ffffffff1681565b348015610624575f80fd5b506102bb610633366004613a33565b6113cd565b348015610643575f80fd5b506103036106523660046133e0565b611497565b348015610662575f80fd5b506102976106713660046133e0565b60a26020525f908152604090205460ff1681565b348015610690575f80fd5b5061029761069f366004613a5f565b6114dc565b3480156106af575f80fd5b506102bb6106be366004613a90565b611563565b6102bb6106d1366004613b73565b611964565b3480156106e1575f80fd5b5060685461026190600160281b90046001600160a01b031681565b348015610707575f80fd5b506102bb6107163660046133e0565b611cfa565b348015610726575f80fd5b50610325610735366004613700565b60696020525f908152604090205481565b348015610751575f80fd5b506102bb610760366004613a90565b611da0565b348015610770575f80fd5b506102bb61077f366004613c02565b612003565b34801561078f575f80fd5b5061029761079e366004613c91565b612090565b604051631bb787f360e11b815260040160405180910390fd5b5f606a5f84846040516020016107d3929190613cd6565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff161561082e57604051630bc011ff60e21b815260040160405180910390fd5b34158015906108475750606f546001600160a01b031615155b15610865576040516301bd897160e61b815260040160405180910390fd5b6108738585348686866120a7565b5050505050565b606e805461088790613d00565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613d00565b80156108fe5780601f106108d5576101008083540402835291602001916108fe565b820191905f5260205f20905b8154815290600101906020018083116108e157829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b60a3546001600160a01b031633146109bd576040516357b738d160e11b815260040160405180910390fd5b825184511415806109d057508151845114155b806109dd57508051845114155b156109fb5760405163434f49f560e11b815260040160405180910390fd5b5f5b825181101561087357610a76858281518110610a1b57610a1b613d38565b6020026020010151858381518110610a3557610a35613d38565b6020026020010151858481518110610a4f57610a4f613d38565b6020026020010151858581518110610a6957610a69613d38565b6020026020010151612171565b80610a8081613d60565b9150506109fd565b6053545f90819081805b6020811015610b5b578083901c600116600103610aef5760338160208110610abc57610abc613d38565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610b1c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610b5390613d60565b915050610a92565b50919392505050565b5f610b858484610b7385612321565b610b7c866123dc565b61057387612490565b949350505050565b605354606854600160c81b900463ffffffff161015610bae57610bae612544565b565b60405180611ba00160405280611b66815260200161444d611b66913981565b5f83815b6020811015610c9b57600163ffffffff8516821c81169003610c3e57848160208110610c0157610c01613d38565b602002013582604051602001610c21929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c89565b81858260208110610c5157610c51613d38565b6020020135604051602001610c70929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610c9381613d60565b915050610bd3565b50949350505050565b5f54610100900460ff1615808015610cc257505f54600160ff909116105b80610cdb5750303b158015610cdb57505f5460ff166001145b610d005760405162461bcd60e51b8152600401610cf790613d78565b60405180910390fd5b5f805460ff191660011790558015610d21575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8d160265010000000000600160c81b03191617600160281b6001600160a01b038a81169190910291909117909155606c80546001600160a01b03199081168984161790915560a380549091168683161790558916610df15763ffffffff881615610db557604051630d43a60960e11b815260040160405180910390fd5b6001600160a01b038316151580610dce57506001821515145b15610dec57604051630e6e237560e11b815260040160405180910390fd5b610f2c565b606d805463ffffffff8a16600160a01b026001600160c01b03199091166001600160a01b038c1617179055606e610e288682613e0b565b506001600160a01b038316610ef457811515600103610e5a57604051630e6e237560e11b815260040160405180910390fd5b610ecf5f801b6012604051602001610ebb91906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b6040516020818303038152906040526125d2565b606f80546001600160a01b0319166001600160a01b0392909216919091179055610f2c565b606f80546001600160a01b0319166001600160a01b0385169081179091555f90815260a260205260409020805460ff19168315151790555b610f3461264c565b8015610f79575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b038083165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290610fe15760405163828d566360e01b815260040160405180910390fd5b5f606a5f835f01518460200151604051602001610fff929190613cd6565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b039081169150841681036110525760405163e273c4a160e01b815260040160405180910390fd5b61105c848461267a565b61106781338561270a565b604080513381526001600160a01b0386811660208301528316818301526060810185905290517fb7f8fd4d1faf9b2929dc269f59c53e3a2bccc44e9950f33a568fcbcb37eb69a99181900360800190a150505050565b5f8086866040516020016110d2929190613cd6565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b66815260200161444d611b66913989898960405160200161112393929190613ec6565b60408051601f19818403018152908290526111419291602001613efe565b6040516020818303038152906040528051906020012060405160200161119994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60a3546001600160a01b031633146111e8576040516357b738d160e11b815260040160405180910390fd5b6111f484848484612171565b50505050565b60a3546001600160a01b03163314611225576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038082165f908152606b6020908152604080832081518083018352905463ffffffff8116808352600160201b909104909516818401819052915190946112759390929101613cd6565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031615806112c957505f818152606a60205260409020546001600160a01b038481169116145b156112e75760405163e0c897a760e01b815260040160405180910390fd5b6001600160a01b0383165f818152606b6020908152604080832080546001600160c01b031916905560a2825291829020805460ff1916905590519182527fc2ae0bd0ec0fd0352bfe5bacac49637af342c1e40f1b80a7f74440dc7fe3f063910160405180910390a1505050565b60685460ff161561137857604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b03166113a15760405163dde3cda760e01b815260040160405180910390fd5b606f546113b7906001600160a01b03168561267a565b6113c58686868686866120a7565b505050505050565b60a3546001600160a01b031633146113f8576040516357b738d160e11b815260040160405180910390fd5b606d546001600160a01b031661142157604051634cb4711360e11b815260040160405180910390fd5b606f80546001600160a01b0319166001600160a01b0384169081179091555f81815260a26020908152604091829020805460ff19168515159081179091558251938452908301527fc7318b7ed6ba4f2908a3de396d8ab49b1dadb55db5b55123247a401f29ff8d82910160405180910390a15050565b60606114a282612321565b6114ab836123dc565b6114b484612490565b6040516020016114c693929190613ec6565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015611501575063ffffffff83166001145b15611513575063ffffffff831661153a565b611527600160201b63ffffffff8516613f2c565b6115379063ffffffff8616613f43565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161561158757604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115b7576040516302caf51760e11b815260040160405180910390fd5b6115ea8c8c8c8c8c6115e55f8e8e8e8e8e8e8e6040516115d8929190613f56565b6040518091039020610906565b61279c565b6001600160a01b0386166116d157606f546001600160a01b03166116b5575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015611640576020820181803683370190505b5060405161164e9190613f65565b5f6040518083038185875af1925050503d805f8114611688576040519150601f19603f3d011682016040523d82523d5f602084013e61168d565b606091505b50509050806116af57604051630ce8f45160e31b815260040160405180910390fd5b506118fa565b606f546116cc906001600160a01b0316858561270a565b6118fa565b606d546001600160a01b0387811691161480156116ff5750606d5463ffffffff888116600160a01b90920416145b15611716575f6001600160a01b0385168482611616565b60685463ffffffff610100909104811690881603611742576116cc6001600160a01b03871685856128fa565b5f8787604051602001611756929190613cd6565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806118ec575f6117cb8386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125d292505050565b90506117d881888861270a565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516118de959493929190613fa8565b60405180910390a1506118f7565b6118f781878761270a565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff161561198857604051630bc011ff60e21b815260040160405180910390fd5b61199061295d565b60685463ffffffff6101009091048116908816036119c1576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816611aa4578834146119f45760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611a2190613d00565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4d90613d00565b8015611a985780601f10611a6f57610100808354040283529160200191611a98565b820191905f5260205f20905b815481529060010190602001808311611a7b57829003601f168201915b50505050509150611c71565b3415611ac35760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603611ae857611ae3888a61267a565b611c71565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015611b4757611b36898b61267a565b602081015181519095509350611c64565b8515611b5957611b59898b89896129b6565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611b9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc19190613fe0565b9050611bd86001600160a01b038b1633308e612cf1565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611c1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c409190613fe0565b9050611c4c8282613ff7565b6068548c9850610100900463ffffffff169650935050505b611c6d89611497565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611cb098979695949392919061400a565b60405180910390a1611cd6611cd15f85878f8f878980519060200120610906565b612d29565b8615611ce457611ce4612544565b50505050611cf160018055565b50505050505050565b60a3546001600160a01b03163314611d25576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038116611d4c57604051631bb787f360e11b815260040160405180910390fd5b60a380546001600160a01b0319166001600160a01b0383169081179091556040519081527f32cf74f8a6d5f88593984d2cd52be5592bfa6884f5896175801a5069ef09cd679060200160405180910390a150565b60685460ff1615611dc457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611df4576040516302caf51760e11b815260040160405180910390fd5b611e168c8c8c8c8c6115e560018e8e8e8e8e8e8e6040516115d8929190613f56565b606f545f906001600160a01b0316611ec957846001600160a01b031684888a8686604051602401611e4a9493929190614074565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611e7f9190613f65565b5f6040518083038185875af1925050503d805f8114611eb9576040519150601f19603f3d011682016040523d82523d5f602084013e611ebe565b606091505b505080915050611f7a565b606f54611ee0906001600160a01b0316868661270a565b846001600160a01b031687898585604051602401611f019493929190614074565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611f369190613f65565b5f604051808303815f865af19150503d805f8114611f6f576040519150601f19603f3d011682016040523d82523d5f602084013e611f74565b606091505b50909150505b80611f98576040516337e391c360e01b815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561202157505f54600160ff909116105b8061203a5750303b15801561203a57505f5460ff166001145b6120565760405162461bcd60e51b8152600401610cf790613d78565b5f805460ff191660011790558015612077575f805461ff0019166101001790555b60405163f57ac68360e01b815260040160405180910390fd5b5f8161209d868686610bcf565b1495945050505050565b60685463ffffffff6101009091048116908716036120d8576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405161212c999897969594939291906140ae565b60405180910390a1612163611cd16001606860019054906101000a900463ffffffff16338a8a8a89896040516115d8929190613f56565b82156113c5576113c5612544565b6001600160a01b038316158061218e57506001600160a01b038216155b156121ac5760405163f6b2911f60e01b815260040160405180910390fd5b60685463ffffffff6101009091048116908516036121dd5760405163658b23ad60e01b815260040160405180910390fd5b6001600160a01b038281165f908152606b6020526040902054600160201b9004161561221c576040516317abdeeb60e21b815260040160405180910390fd5b5f8484604051602001612230929190613cd6565b60408051808303601f1901815282825280516020918201205f818152606a835283812080546001600160a01b0319166001600160a01b038a8116918217909255868601865263ffffffff8c81168089528c8416878a01818152848752606b89528987209a518b54915194166001600160c01b031990911617600160201b93909516929092029390931790975560a2855291859020805460ff191689151590811790915585519182529381019590955292840192909252606083015291507fdbe8a5da6a7a916d9adfda9160167a0f8a3da415ee6610e810e753853597fce79060800160405180910390a15050505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916123679190613f65565b5f60405180830381855afa9150503d805f811461239f576040519150601f19603f3d011682016040523d82523d5f602084013e6123a4565b606091505b5091509150816123d357604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610b85565b610b8581612e11565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916124229190613f65565b5f60405180830381855afa9150503d805f811461245a576040519150601f19603f3d011682016040523d82523d5f602084013e61245f565b606091505b5091509150816123d357604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610b85565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916124d59190613f65565b5f60405180830381855afa9150503d805f811461250d576040519150601f19603f3d011682016040523d82523d5f602084013e612512565b606091505b5091509150818015612525575080516020145b612530576012610b85565b80806020019051810190610b85919061411a565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d61258b610a88565b6040518263ffffffff1660e01b81526004016125a991815260200190565b5f604051808303815f87803b1580156125c0575f80fd5b505af11580156111f4573d5f803e3d5ffd5b5f8060405180611ba00160405280611b66815260200161444d611b66913983604051602001612602929190613efe565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612645576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b5f54610100900460ff166126725760405162461bcd60e51b8152600401610cf790614135565b610bae612f9a565b6001600160a01b0382165f90815260a2602052604090205460ff16156126b3576126af6001600160a01b038316333084612cf1565b5050565b604051632770a7eb60e21b8152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b1580156126f8575f80fd5b505af11580156113c5573d5f803e3d5ffd5b6001600160a01b0383165f90815260a2602052604090205460ff16156127435761273e6001600160a01b03841683836128fa565b505050565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b15801561278a575f80fd5b505af1158015611cf1573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612812573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128369190613fe0565b9050805f0361285757604051622f6fad60e01b815260040160405180910390fd5b5f806801000000000000000087161561289b57869150612879848a8489612090565b612896576040516338105f3b60e21b815260040160405180910390fd5b6128e5565b602087901c6128ab816001614180565b91508792506128c66128be868c86610bcf565b8a8389612090565b6128e3576040516338105f3b60e21b815260040160405180910390fd5b505b6128ef8282612fc0565b505050505050505050565b6040516001600160a01b03831660248201526044810182905261273e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613066565b6002600154036129af5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610cf7565b6002600155565b5f6129c4600482848661419d565b6129cd916141c4565b9050632afa533160e01b6001600160e01b0319821601612b5c575f8080808080806129fb896004818d61419d565b810190612a0891906141f4565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614612a485760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014612a715760405163750643af60e01b815260040160405180910390fd5b8a8514612a91576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691612b0f9190613f65565b5f604051808303815f865af19150503d805f8114612b48576040519150601f19603f3d011682016040523d82523d5f602084013e612b4d565b606091505b50505050505050505050610873565b6001600160e01b031981166323f2ebc360e21b14612b8d57604051637141605d60e11b815260040160405180910390fd5b5f80808080808080612ba28a6004818e61419d565b810190612baf9190614243565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614612bf15760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014612c1a5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691612ca19190613f65565b5f604051808303815f865af19150503d805f8114612cda576040519150601f19603f3d011682016040523d82523d5f602084013e612cdf565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526111f49085906323b872dd60e01b90608401612926565b806001612d38602060026143a1565b612d429190613ff7565b60535410612d63576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154612d7290613d60565b918290555090505f5b6020811015612e02578082901c600116600103612dae578260338260208110612da657612da6613d38565b015550505050565b60338160208110612dc157612dc1613d38565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612dfa90613d60565b915050612d7b565b5061273e6143ac565b60018055565b60606040825110612e30578180602001905181019061080491906143c0565b8151602003612f67575f5b602081108015612e6a5750828181518110612e5857612e58613d38565b01602001516001600160f81b03191615155b15612e815780612e7981613d60565b915050612e3b565b805f03612eb85750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115612ed157612ed1613483565b6040519080825280601f01601f191660200182016040528015612efb576020820181803683370190505b5090505f5b82811015612f5f57848181518110612f1a57612f1a613d38565b602001015160f81c60f81b828281518110612f3757612f37613d38565b60200101906001600160f81b03191690815f1a90535080612f5781613d60565b915050612f00565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16612e0b5760405162461bcd60e51b8152600401610cf790614135565b6068545f90610100900463ffffffff16158015612fe3575063ffffffff82166001145b15612ff5575063ffffffff821661301c565b613009600160201b63ffffffff8416613f2c565b6130199063ffffffff8516613f43565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611cf157604051630c8d9eab60e31b815260040160405180910390fd5b5f6130ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131399092919063ffffffff16565b905080515f14806130da5750808060200190518101906130da9190614431565b61273e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cf7565b6060610b8584845f85855f80866001600160a01b0316858760405161315e9190613f65565b5f6040518083038185875af1925050503d805f8114613198576040519150601f19603f3d011682016040523d82523d5f602084013e61319d565b606091505b50915091506131ae878383876131b9565b979650505050505050565b606083156132275782515f03613220576001600160a01b0385163b6132205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cf7565b5081610b85565b610b85838381511561323c5781518083602001fd5b8060405162461bcd60e51b8152600401610cf791906133c7565b803563ffffffff81168114612f95575f80fd5b6001600160a01b038116811461327d575f80fd5b50565b5f8060408385031215613291575f80fd5b61329a83613256565b915060208301356132aa81613269565b809150509250929050565b801515811461327d575f80fd5b5f8083601f8401126132d2575f80fd5b5081356001600160401b038111156132e8575f80fd5b6020830191508360208285010111156132ff575f80fd5b9250929050565b5f805f805f6080868803121561331a575f80fd5b61332386613256565b9450602086013561333381613269565b93506040860135613343816132b5565b925060608601356001600160401b0381111561335d575f80fd5b613369888289016132c2565b969995985093965092949392505050565b5f5b8381101561339457818101518382015260200161337c565b50505f910152565b5f81518084526133b381602086016020860161337a565b601f01601f19169290920160200192915050565b602081525f6133d9602083018461339c565b9392505050565b5f602082840312156133f0575f80fd5b81356133d981613269565b60ff8116811461327d575f80fd5b5f805f805f805f60e0888a03121561341f575f80fd5b873561342a816133fb565b965061343860208901613256565b9550604088013561344881613269565b945061345660608901613256565b9350608088013561346681613269565b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156134bf576134bf613483565b604052919050565b5f6001600160401b038211156134df576134df613483565b5060051b60200190565b5f82601f8301126134f8575f80fd5b8135602061350d613508836134c7565b613497565b82815260059290921b8401810191818101908684111561352b575f80fd5b8286015b8481101561354f57803561354281613269565b835291830191830161352f565b509695505050505050565b5f82601f830112613569575f80fd5b81356020613579613508836134c7565b82815260059290921b84018101918181019086841115613597575f80fd5b8286015b8481101561354f5780356135ae816132b5565b835291830191830161359b565b5f805f80608085870312156135ce575f80fd5b84356001600160401b03808211156135e4575f80fd5b818701915087601f8301126135f7575f80fd5b81356020613607613508836134c7565b82815260059290921b8401810191818101908b841115613625575f80fd5b948201945b8386101561364a5761363b86613256565b8252948201949082019061362a565b9850508801359250508082111561365f575f80fd5b61366b888389016134e9565b94506040870135915080821115613680575f80fd5b61368c888389016134e9565b935060608701359150808211156136a1575f80fd5b506136ae8782880161355a565b91505092959194509250565b5f805f606084860312156136cc575f80fd5b6136d584613256565b925060208401356136e581613269565b915060408401356136f581613269565b809150509250925092565b5f60208284031215613710575f80fd5b5035919050565b806104008101831015610804575f80fd5b5f805f610440848603121561373b575f80fd5b8335925061374c8560208601613717565b915061375b6104208501613256565b90509250925092565b5f6001600160401b0382111561377c5761377c613483565b50601f01601f191660200190565b5f82601f830112613799575f80fd5b81356137a761350882613764565b8181528460208386010111156137bb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f805f6101208a8c0312156137f0575f80fd5b6137f98a613256565b985060208a013561380981613269565b975061381760408b01613256565b965060608a013561382781613269565b955060808a013561383781613269565b945060a08a01356001600160401b03811115613851575f80fd5b61385d8c828d0161378a565b94505060c08a013561386e81613269565b925060e08a013561387e81613269565b91506101008a013561388f816132b5565b809150509295985092959850929598565b5f80604083850312156138b1575f80fd5b82356138bc81613269565b946020939093013593505050565b5f805f805f60a086880312156138de575f80fd5b6138e786613256565b945060208601356138f781613269565b935060408601356001600160401b0380821115613912575f80fd5b61391e89838a0161378a565b94506060880135915080821115613933575f80fd5b506139408882890161378a565b9250506080860135613951816133fb565b809150509295509295909350565b5f805f8060808587031215613972575f80fd5b61397b85613256565b9350602085013561398b81613269565b9250604085013561399b81613269565b915060608501356139ab816132b5565b939692955090935050565b5f805f805f8060a087890312156139cb575f80fd5b6139d487613256565b955060208701356139e481613269565b94506040870135935060608701356139fb816132b5565b925060808701356001600160401b03811115613a15575f80fd5b613a2189828a016132c2565b979a9699509497509295939492505050565b5f8060408385031215613a44575f80fd5b8235613a4f81613269565b915060208301356132aa816132b5565b5f8060408385031215613a70575f80fd5b613a7983613256565b9150613a8760208401613256565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613aac575f80fd5b613ab68e8e613717565b9b50613ac68e6104008f01613717565b9a506108008d013599506108208d013598506108408d01359750613aed6108608e01613256565b9650613afd6108808e0135613269565b6108808d01359550613b126108a08e01613256565b9450613b226108c08e0135613269565b6108c08d013593506108e08d013592506001600160401b036109008e01351115613b4a575f80fd5b613b5b8e6109008f01358f016132c2565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613b89575f80fd5b613b9288613256565b96506020880135613ba281613269565b9550604088013594506060880135613bb981613269565b93506080880135613bc9816132b5565b925060a08801356001600160401b03811115613be3575f80fd5b613bef8a828b016132c2565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613c17575f80fd5b613c2087613256565b95506020870135613c3081613269565b9450613c3e60408801613256565b93506060870135613c4e81613269565b92506080870135613c5e81613269565b915060a08701356001600160401b03811115613c78575f80fd5b613c8489828a0161378a565b9150509295509295509295565b5f805f806104608587031215613ca5575f80fd5b84359350613cb68660208701613717565b9250613cc56104208601613256565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c90821680613d1457607f821691505b602082108103613d3257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613d7157613d71613d4c565b5060010190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f82111561273e575f81815260208120601f850160051c81016020861015613dec5750805b601f850160051c820191505b818110156113c557828155600101613df8565b81516001600160401b03811115613e2457613e24613483565b613e3881613e328454613d00565b84613dc6565b602080601f831160018114613e6b575f8415613e545750858301515b5f19600386901b1c1916600185901b1785556113c5565b5f85815260208120601f198616915b82811015613e9957888601518255948401946001909101908401613e7a565b5085821015613eb657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613ed8606083018661339c565b8281036020840152613eea818661339c565b91505060ff83166040830152949350505050565b5f8351613f0f81846020880161337a565b835190830190613f2381836020880161337a565b01949350505050565b808202811582820484141761080457610804613d4c565b8082018082111561080457610804613d4c565b818382375f9101908152919050565b5f8251613f7681846020870161337a565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906131ae9083018486613f80565b5f60208284031215613ff0575f80fd5b5051919050565b8181038181111561080457610804613d4c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161405b8483018761339c565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906140a49083018486613f80565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916141008483018789613f80565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561412a575f80fd5b81516133d9816133fb565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b63ffffffff81811683821601908082111561264557612645613d4c565b5f80858511156141ab575f80fd5b838611156141b7575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156141ec5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121561420a575f80fd5b873561421581613269565b9650602088013561422581613269565b955060408801359450606088013593506080880135613466816133fb565b5f805f805f805f80610100898b03121561425b575f80fd5b883561426681613269565b9750602089013561427681613269565b965060408901359550606089013594506080890135614294816132b5565b935060a08901356142a4816133fb565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156142fb57815f19048211156142e1576142e1613d4c565b808516156142ee57918102915b93841c93908002906142c6565b509250929050565b5f8261431157506001610804565b8161431d57505f610804565b8160018114614333576002811461433d57614359565b6001915050610804565b60ff84111561434e5761434e613d4c565b50506001821b610804565b5060208310610133831016604e8410600b841016171561437c575081810a610804565b61438683836142c1565b805f190482111561439957614399613d4c565b029392505050565b5f6133d98383614303565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156143d0575f80fd5b81516001600160401b038111156143e5575f80fd5b8201601f810184136143f5575f80fd5b805161440361350882613764565b818152856020838501011115614417575f80fd5b61442882602083016020860161337a565b95945050505050565b5f60208284031215614441575f80fd5b81516133d9816132b556fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a264697066735822122013d210c8d7909d85898f57631a6600a5629bbd76a2d79a352fa89eb87df8db9164736f6c63430008140033", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountDoesNotMatchMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DestinationNetworkInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmergencyStateNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EtherTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedTokenWrappedDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasTokenNetworkMustBeZeroOnEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InputArraysLengthMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializeFunction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSmtProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSovereignWETHAddressParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MerkleTreeFull\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MsgValueNotZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeTokenIsEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoValueInMessagesOnGasTokenNetworks\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBridgeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyRollupManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OriginNetworkInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenAlreadyMapped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenAlreadyUpdated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenNotMapped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenNotRemapped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WETHRemappingNotSupportedOnGasTokenNetworks\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"depositCount\",\"type\":\"uint32\"}],\"name\":\"BridgeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"legacyTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"updatedTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"MigrateLegacyToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"NewWrappedToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sovereignTokenAddress\",\"type\":\"address\"}],\"name\":\"RemoveLegacySovereignTokenAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bridgeManager\",\"type\":\"address\"}],\"name\":\"SetBridgeManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sovereignTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"SetSovereignTokenAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sovereignWETHTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"SetSovereignWETHAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"leafIndex\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sourceBridgeNetwork\",\"type\":\"uint32\"}],\"name\":\"UnsetClaim\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_INIT_BYTECODE_WRAPPED_TOKEN\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WETHToken\",\"outputs\":[{\"internalType\":\"contractTokenWrapped\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"permitData\",\"type\":\"bytes\"}],\"name\":\"bridgeAsset\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountWETH\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessageWETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"}],\"name\":\"calculateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"calculateTokenWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimedBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenMetadata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenNetwork\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"name\":\"getLeafValue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenMetadata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"name\":\"getTokenWrappedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_networkID\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_gasTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_gasTokenNetwork\",\"type\":\"uint32\"},{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_polygonRollupManager\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_gasTokenMetadata\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_bridgeManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sovereignWETHAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_sovereignWETHAddressIsNotMintable\",\"type\":\"bool\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"leafIndex\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"sourceBridgeNetwork\",\"type\":\"uint32\"}],\"name\":\"isClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdatedDepositCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"legacyTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"migrateLegacyToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"polygonRollupManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"precalculatedWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"legacySovereignTokenAddress\",\"type\":\"address\"}],\"name\":\"removeLegacySovereignTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridgeManager\",\"type\":\"address\"}],\"name\":\"setBridgeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"originNetworks\",\"type\":\"uint32[]\"},{\"internalType\":\"address[]\",\"name\":\"originTokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"sovereignTokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"isNotMintable\",\"type\":\"bool[]\"}],\"name\":\"setMultipleSovereignTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sovereignWETHTokenAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"name\":\"setSovereignWETHAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tokenInfoToWrappedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"leafIndexes\",\"type\":\"uint32[]\"},{\"internalType\":\"uint32[]\",\"name\":\"sourceBridgeNetworks\",\"type\":\"uint32[]\"}],\"name\":\"unsetMultipleClaimedBitmap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateGlobalExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedAddress\",\"type\":\"address\"}],\"name\":\"wrappedAddressIsNotMintable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isNotMintable\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokenToTokenInfo\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801562000010575f80fd5b506200001b6200002b565b620000256200002b565b620000e9565b5f54610100900460ff1615620000975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000e7575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615ffb80620000f75f395ff3fe60806040526004361061023e575f3560e01c80638c0dd47011610134578063c0f49163116100b3578063dbc1697611610078578063dbc16976146102a7578063eabd372a146106fc578063ee25560b1461071b578063f5efcd7914610746578063f811bff714610765578063fb57083414610784575f80fd5b8063c0f4916314610657578063cc46163214610685578063ccaa2d11146106a4578063cd586579146106c3578063d02103ca146106d6575f80fd5b8063b8b284d0116100f9578063b8b284d0146105b6578063bab161bf146105d5578063be5831c7146105f6578063bf130d7f14610619578063c00f14ab14610638575f80fd5b80638c0dd4701461051b5780638ed7e3f21461053a5780639e76158f14610559578063aaa13cc214610578578063b458696214610597575f80fd5b80633e197043116101c057806379e2cf971161018557806379e2cf971461048157806381b1c1741461049557806383c43a55146104c957806383f24403146104dd5780638781a5c5146104fc575f80fd5b80633e197043146103f15780634b2f336d1461041057806357cfbee31461042f5780635ca1e1651461044e5780637843298b14610462575f80fd5b806327aef4e81161020657806327aef4e8146102ef5780632dfdf0b514610310578063318aee3d146103335780633c351e101461039a5780633cbc795b146103b9575f80fd5b806314cc01a01461024257806315064c961461027e5780632072f6c5146102a757806322e95f2c146102bd578063240ff378146102dc575b5f80fd5b34801561024d575f80fd5b5060a354610261906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610289575f80fd5b506068546102979060ff1681565b6040519015158152602001610275565b3480156102b2575f80fd5b506102bb6107a3565b005b3480156102c8575f80fd5b506102616102d736600461328d565b6107bc565b6102bb6102ea366004613313565b61080a565b3480156102fa575f80fd5b5061030361087a565b60405161027591906133d4565b34801561031b575f80fd5b5061032560535481565b604051908152602001610275565b34801561033e575f80fd5b5061037661034d3660046133ed565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610275565b3480156103a5575f80fd5b50606d54610261906001600160a01b031681565b3480156103c4575f80fd5b50606d546103dc90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610275565b3480156103fc575f80fd5b5061032561040b366004613416565b610906565b34801561041b575f80fd5b50606f54610261906001600160a01b031681565b34801561043a575f80fd5b506102bb6104493660046135c6565b610992565b348015610459575f80fd5b50610325610a88565b34801561046d575f80fd5b5061026161047c3660046136c5565b610b64565b34801561048c575f80fd5b506102bb610b8d565b3480156104a0575f80fd5b506102616104af36600461370b565b606a6020525f90815260409020546001600160a01b031681565b3480156104d4575f80fd5b50610303610bb0565b3480156104e8575f80fd5b506103256104f7366004613733565b610bcf565b348015610507575f80fd5b506102bb61051636600461376f565b610ca4565b348015610526575f80fd5b506102bb610535366004613841565b610d4f565b348015610545575f80fd5b50606c54610261906001600160a01b031681565b348015610564575f80fd5b506102bb61057336600461390a565b61102b565b348015610583575f80fd5b50610261610592366004613934565b611163565b3480156105a2575f80fd5b506102bb6105b13660046133ed565b611263565b3480156105c1575f80fd5b506102bb6105d03660046139c9565b6113bd565b3480156105e0575f80fd5b506068546103dc90610100900463ffffffff1681565b348015610601575f80fd5b506068546103dc90600160c81b900463ffffffff1681565b348015610624575f80fd5b506102bb610633366004613a46565b611436565b348015610643575f80fd5b506103036106523660046133ed565b611500565b348015610662575f80fd5b506102976106713660046133ed565b60a26020525f908152604090205460ff1681565b348015610690575f80fd5b5061029761069f366004613a72565b611545565b3480156106af575f80fd5b506102bb6106be366004613aa3565b611595565b6102bb6106d1366004613b86565b611996565b3480156106e1575f80fd5b5060685461026190600160281b90046001600160a01b031681565b348015610707575f80fd5b506102bb6107163660046133ed565b611d2c565b348015610726575f80fd5b5061032561073536600461370b565b60696020525f908152604090205481565b348015610751575f80fd5b506102bb610760366004613aa3565b611dab565b348015610770575f80fd5b506102bb61077f366004613c15565b61200e565b34801561078f575f80fd5b5061029761079e366004613ca4565b6120ac565b60405163441845b160e01b815260040160405180910390fd5b5f606a5f84846040516020016107d3929190613ce9565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff161561082e57604051630bc011ff60e21b815260040160405180910390fd5b34158015906108475750606f546001600160a01b031615155b15610865576040516301bd897160e61b815260040160405180910390fd5b6108738585348686866120c3565b5050505050565b606e805461088790613d13565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613d13565b80156108fe5780601f106108d5576101008083540402835291602001916108fe565b820191905f5260205f20905b8154815290600101906020018083116108e157829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b60a3546001600160a01b031633146109bd576040516357b738d160e11b815260040160405180910390fd5b825184511415806109d057508151845114155b806109dd57508051845114155b156109fb5760405163434f49f560e11b815260040160405180910390fd5b5f5b825181101561087357610a76858281518110610a1b57610a1b613d4b565b6020026020010151858381518110610a3557610a35613d4b565b6020026020010151858481518110610a4f57610a4f613d4b565b6020026020010151858581518110610a6957610a69613d4b565b602002602001015161218d565b80610a8081613d73565b9150506109fd565b6053545f90819081805b6020811015610b5b578083901c600116600103610aef5760338160208110610abc57610abc613d4b565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610b1c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610b5390613d73565b915050610a92565b50919392505050565b5f610b858484610b738561233d565b610b7c866123f8565b610592876124ac565b949350505050565b605354606854600160c81b900463ffffffff161015610bae57610bae612560565b565b60405180611ba00160405280611b668152602001614460611b66913981565b5f83815b6020811015610c9b57600163ffffffff8516821c81169003610c3e57848160208110610c0157610c01613d4b565b602002013582604051602001610c21929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c89565b81858260208110610c5157610c51613d4b565b6020020135604051602001610c70929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610c9381613d73565b915050610bd3565b50949350505050565b60a3546001600160a01b03163314610ccf576040516357b738d160e11b815260040160405180910390fd5b8051825114610cf15760405163434f49f560e11b815260040160405180910390fd5b5f5b8251811015610d4a57610d38838281518110610d1157610d11613d4b565b6020026020010151838381518110610d2b57610d2b613d4b565b60200260200101516125f4565b80610d4281613d73565b915050610cf3565b505050565b5f54610100900460ff1615808015610d6d57505f54600160ff909116105b80610d865750303b158015610d8657505f5460ff166001145b610dab5760405162461bcd60e51b8152600401610da290613d8b565b60405180910390fd5b5f805460ff191660011790558015610dcc575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8d160265010000000000600160c81b03191617600160281b6001600160a01b038a81169190910291909117909155606c80546001600160a01b03199081168984161790915560a380549091168683161790558916610e975763ffffffff881615610e6057604051630d43a60960e11b815260040160405180910390fd5b6001600160a01b038316151580610e745750815b15610e9257604051630e6e237560e11b815260040160405180910390fd5b610fd2565b606d805463ffffffff8a16600160a01b026001600160c01b03199091166001600160a01b038c1617179055606e610ece8682613e1e565b506001600160a01b038316610f9a57811515600103610f0057604051630e6e237560e11b815260040160405180910390fd5b610f755f801b6012604051602001610f6191906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b6040516020818303038152906040526126a2565b606f80546001600160a01b0319166001600160a01b0392909216919091179055610fd2565b606f80546001600160a01b0319166001600160a01b0385169081179091555f90815260a260205260409020805460ff19168315151790555b610fda61271c565b801561101f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b038083165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052906110875760405163828d566360e01b815260040160405180910390fd5b5f606a5f835f015184602001516040516020016110a5929190613ce9565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b039081169150841681036110f85760405163e273c4a160e01b815260040160405180910390fd5b611102848461274a565b61110d8133856127da565b604080513381526001600160a01b0386811660208301528316818301526060810185905290517fb7f8fd4d1faf9b2929dc269f59c53e3a2bccc44e9950f33a568fcbcb37eb69a99181900360800190a150505050565b5f808686604051602001611178929190613ce9565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001614460611b6691398989896040516020016111c993929190613ed9565b60408051601f19818403018152908290526111e79291602001613f11565b6040516020818303038152906040528051906020012060405160200161123f94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60a3546001600160a01b0316331461128e576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038082165f908152606b6020908152604080832081518083018352905463ffffffff8116808352600160201b909104909516818401819052915190946112de9390929101613ce9565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316158061133257505f818152606a60205260409020546001600160a01b038481169116145b156113505760405163e0c897a760e01b815260040160405180910390fd5b6001600160a01b0383165f818152606b6020908152604080832080546001600160c01b031916905560a2825291829020805460ff1916905590519182527fc2ae0bd0ec0fd0352bfe5bacac49637af342c1e40f1b80a7f74440dc7fe3f063910160405180910390a1505050565b60685460ff16156113e157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031661140a5760405163dde3cda760e01b815260040160405180910390fd5b606f54611420906001600160a01b03168561274a565b61142e8686868686866120c3565b505050505050565b60a3546001600160a01b03163314611461576040516357b738d160e11b815260040160405180910390fd5b606d546001600160a01b031661148a57604051634cb4711360e11b815260040160405180910390fd5b606f80546001600160a01b0319166001600160a01b0384169081179091555f81815260a26020908152604091829020805460ff19168515159081179091558251938452908301527fc7318b7ed6ba4f2908a3de396d8ab49b1dadb55db5b55123247a401f29ff8d82910160405180910390a15050565b606061150b8261233d565b611514836123f8565b61151d846124ac565b60405160200161152f93929190613ed9565b6040516020818303038152906040529050919050565b5f8061155b600160201b63ffffffff8516613f3f565b61156b9063ffffffff8616613f56565b600881901c5f90815260696020526040902054600160ff9092169190911b90811614949350505050565b60685460ff16156115b957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115e9576040516302caf51760e11b815260040160405180910390fd5b61161c8c8c8c8c8c6116175f8e8e8e8e8e8e8e60405161160a929190613f69565b6040518091039020610906565b612867565b6001600160a01b03861661170357606f546001600160a01b03166116e7575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015611672576020820181803683370190505b506040516116809190613f78565b5f6040518083038185875af1925050503d805f81146116ba576040519150601f19603f3d011682016040523d82523d5f602084013e6116bf565b606091505b50509050806116e157604051630ce8f45160e31b815260040160405180910390fd5b5061192c565b606f546116fe906001600160a01b031685856127da565b61192c565b606d546001600160a01b0387811691161480156117315750606d5463ffffffff888116600160a01b90920416145b15611748575f6001600160a01b0385168482611648565b60685463ffffffff610100909104811690881603611774576116fe6001600160a01b03871685856129c5565b5f8787604051602001611788929190613ce9565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168061191e575f6117fd8386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506126a292505050565b905061180a8188886127da565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a838888604051611910959493929190613fbb565b60405180910390a150611929565b6119298187876127da565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156119ba57604051630bc011ff60e21b815260040160405180910390fd5b6119c2612a28565b60685463ffffffff6101009091048116908816036119f3576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816611ad657883414611a265760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611a5390613d13565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7f90613d13565b8015611aca5780601f10611aa157610100808354040283529160200191611aca565b820191905f5260205f20905b815481529060010190602001808311611aad57829003601f168201915b50505050509150611ca3565b3415611af55760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603611b1a57611b15888a61274a565b611ca3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015611b7957611b68898b61274a565b602081015181519095509350611c96565b8515611b8b57611b8b898b8989612a81565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015611bcf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf39190613ff3565b9050611c0a6001600160a01b038b1633308e612d32565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611c4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c729190613ff3565b9050611c7e828261400a565b6068548c9850610100900463ffffffff169650935050505b611c9f89611500565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611ce298979695949392919061401d565b60405180910390a1611d08611d035f85878f8f878980519060200120610906565b612d6a565b8615611d1657611d16612560565b50505050611d2360018055565b50505050505050565b60a3546001600160a01b03163314611d57576040516357b738d160e11b815260040160405180910390fd5b60a380546001600160a01b0319166001600160a01b0383169081179091556040519081527f32cf74f8a6d5f88593984d2cd52be5592bfa6884f5896175801a5069ef09cd679060200160405180910390a150565b60685460ff1615611dcf57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611dff576040516302caf51760e11b815260040160405180910390fd5b611e218c8c8c8c8c61161760018e8e8e8e8e8e8e60405161160a929190613f69565b606f545f906001600160a01b0316611ed457846001600160a01b031684888a8686604051602401611e559493929190614087565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611e8a9190613f78565b5f6040518083038185875af1925050503d805f8114611ec4576040519150601f19603f3d011682016040523d82523d5f602084013e611ec9565b606091505b505080915050611f85565b606f54611eeb906001600160a01b031686866127da565b846001600160a01b031687898585604051602401611f0c9493929190614087565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611f419190613f78565b5f604051808303815f865af19150503d805f8114611f7a576040519150601f19603f3d011682016040523d82523d5f602084013e611f7f565b606091505b50909150505b80611fa3576040516337e391c360e01b815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561202c57505f54600160ff909116105b806120455750303b15801561204557505f5460ff166001145b6120615760405162461bcd60e51b8152600401610da290613d8b565b5f805460ff191660011790558015612082575f805461ff0019166101001790555b60405163f57ac68360e01b815260040160405180910390fd5b60405180910390a150505050505050565b5f816120b9868686610bcf565b1495945050505050565b60685463ffffffff6101009091048116908716036120f4576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051612148999897969594939291906140c1565b60405180910390a161217f611d036001606860019054906101000a900463ffffffff16338a8a8a898960405161160a929190613f69565b821561142e5761142e612560565b6001600160a01b03831615806121aa57506001600160a01b038216155b156121c85760405163f6b2911f60e01b815260040160405180910390fd5b60685463ffffffff6101009091048116908516036121f95760405163658b23ad60e01b815260040160405180910390fd5b6001600160a01b038281165f908152606b6020526040902054600160201b90041615612238576040516317abdeeb60e21b815260040160405180910390fd5b5f848460405160200161224c929190613ce9565b60408051808303601f1901815282825280516020918201205f818152606a835283812080546001600160a01b0319166001600160a01b038a8116918217909255868601865263ffffffff8c81168089528c8416878a01818152848752606b89528987209a518b54915194166001600160c01b031990911617600160201b93909516929092029390931790975560a2855291859020805460ff191689151590811790915585519182529381019590955292840192909252606083015291507fdbe8a5da6a7a916d9adfda9160167a0f8a3da415ee6610e810e753853597fce79060800160405180910390a15050505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916123839190613f78565b5f60405180830381855afa9150503d805f81146123bb576040519150601f19603f3d011682016040523d82523d5f602084013e6123c0565b606091505b5091509150816123ef57604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610b85565b610b8581612e52565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169161243e9190613f78565b5f60405180830381855afa9150503d805f8114612476576040519150601f19603f3d011682016040523d82523d5f602084013e61247b565b606091505b5091509150816123ef57604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610b85565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916124f19190613f78565b5f60405180830381855afa9150503d805f8114612529576040519150601f19603f3d011682016040523d82523d5f602084013e61252e565b606091505b5091509150818015612541575080516020145b61254c576012610b85565b80806020019051810190610b85919061412d565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6125a7610a88565b6040518263ffffffff1660e01b81526004016125c591815260200190565b5f604051808303815f87803b1580156125dc575f80fd5b505af11580156125ee573d5f803e3d5ffd5b50505050565b5f612609600160201b63ffffffff8416613f3f565b6126199063ffffffff8516613f56565b600881901c5f8181526069602052604090208054600160ff851690811b91821892839055939450919291908082161561266557604051630631b5f760e31b815260040160405180910390fd5b6040805163ffffffff808a168252881660208201527f4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a910161209b565b5f8060405180611ba00160405280611b668152602001614460611b669139836040516020016126d2929190613f11565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612715576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b5f54610100900460ff166127425760405162461bcd60e51b8152600401610da290614148565b610bae612fdb565b6001600160a01b0382165f90815260a2602052604090205460ff16156127835761277f6001600160a01b038316333084612d32565b5050565b604051632770a7eb60e21b8152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b1580156127c8575f80fd5b505af115801561142e573d5f803e3d5ffd5b6001600160a01b0383165f90815260a2602052604090205460ff161561280e57610d4a6001600160a01b03841683836129c5565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b158015612855575f80fd5b505af1158015611d23573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af11580156128dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129019190613ff3565b9050805f0361292257604051622f6fad60e01b815260040160405180910390fd5b5f806801000000000000000087161561296657869150612944848a84896120ac565b612961576040516338105f3b60e21b815260040160405180910390fd5b6129b0565b602087901c612976816001614193565b9150879250612991612989868c86610bcf565b8a83896120ac565b6129ae576040516338105f3b60e21b815260040160405180910390fd5b505b6129ba8282613001565b505050505050505050565b6040516001600160a01b038316602482015260448101829052610d4a90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613073565b600260015403612a7a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610da2565b6002600155565b5f612a8f60048284866141b0565b612a98916141d7565b9050632afa533160e01b6001600160e01b0319821601612bcc575f808080808080612ac6896004818d6141b0565b810190612ad39190614207565b96509650965096509650965096508a8514612b01576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691612b7f9190613f78565b5f604051808303815f865af19150503d805f8114612bb8576040519150601f19603f3d011682016040523d82523d5f602084013e612bbd565b606091505b50505050505050505050610873565b6001600160e01b031981166323f2ebc360e21b14612bfd57604051637141605d60e11b815260040160405180910390fd5b5f80808080808080612c128a6004818e6141b0565b810190612c1f9190614256565b975097509750975097509750975097508c6001600160a01b0316638fcbaf0c60e01b8989898989898989604051602401612ca49897969594939291906001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612ce29190613f78565b5f604051808303815f865af19150503d805f8114612d1b576040519150601f19603f3d011682016040523d82523d5f602084013e612d20565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125ee9085906323b872dd60e01b906084016129f1565b806001612d79602060026143b4565b612d83919061400a565b60535410612da4576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154612db390613d73565b918290555090505f5b6020811015612e43578082901c600116600103612def578260338260208110612de757612de7613d4b565b015550505050565b60338160208110612e0257612e02613d4b565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612e3b90613d73565b915050612dbc565b50610d4a6143bf565b60018055565b60606040825110612e71578180602001905181019061080491906143d3565b8151602003612fa8575f5b602081108015612eab5750828181518110612e9957612e99613d4b565b01602001516001600160f81b03191615155b15612ec25780612eba81613d73565b915050612e7c565b805f03612ef95750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115612f1257612f12613490565b6040519080825280601f01601f191660200182016040528015612f3c576020820181803683370190505b5090505f5b82811015612fa057848181518110612f5b57612f5b613d4b565b602001015160f81c60f81b828281518110612f7857612f78613d4b565b60200101906001600160f81b03191690815f1a90535080612f9881613d73565b915050612f41565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16612e4c5760405162461bcd60e51b8152600401610da290614148565b5f613016600160201b63ffffffff8416613f3f565b6130269063ffffffff8516613f56565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055949550929392918183169003611d2357604051630c8d9eab60e31b815260040160405180910390fd5b5f6130c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131469092919063ffffffff16565b905080515f14806130e75750808060200190518101906130e79190614444565b610d4a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610da2565b6060610b8584845f85855f80866001600160a01b0316858760405161316b9190613f78565b5f6040518083038185875af1925050503d805f81146131a5576040519150601f19603f3d011682016040523d82523d5f602084013e6131aa565b606091505b50915091506131bb878383876131c6565b979650505050505050565b606083156132345782515f0361322d576001600160a01b0385163b61322d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da2565b5081610b85565b610b8583838151156132495781518083602001fd5b8060405162461bcd60e51b8152600401610da291906133d4565b803563ffffffff81168114612fd6575f80fd5b6001600160a01b038116811461328a575f80fd5b50565b5f806040838503121561329e575f80fd5b6132a783613263565b915060208301356132b781613276565b809150509250929050565b801515811461328a575f80fd5b5f8083601f8401126132df575f80fd5b5081356001600160401b038111156132f5575f80fd5b60208301915083602082850101111561330c575f80fd5b9250929050565b5f805f805f60808688031215613327575f80fd5b61333086613263565b9450602086013561334081613276565b93506040860135613350816132c2565b925060608601356001600160401b0381111561336a575f80fd5b613376888289016132cf565b969995985093965092949392505050565b5f5b838110156133a1578181015183820152602001613389565b50505f910152565b5f81518084526133c0816020860160208601613387565b601f01601f19169290920160200192915050565b602081525f6133e660208301846133a9565b9392505050565b5f602082840312156133fd575f80fd5b81356133e681613276565b60ff8116811461328a575f80fd5b5f805f805f805f60e0888a03121561342c575f80fd5b873561343781613408565b965061344560208901613263565b9550604088013561345581613276565b945061346360608901613263565b9350608088013561347381613276565b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156134cc576134cc613490565b604052919050565b5f6001600160401b038211156134ec576134ec613490565b5060051b60200190565b5f82601f830112613505575f80fd5b8135602061351a613515836134d4565b6134a4565b82815260059290921b84018101918181019086841115613538575f80fd5b8286015b8481101561355a5761354d81613263565b835291830191830161353c565b509695505050505050565b5f82601f830112613574575f80fd5b81356020613584613515836134d4565b82815260059290921b840181019181810190868411156135a2575f80fd5b8286015b8481101561355a5780356135b981613276565b83529183019183016135a6565b5f805f80608085870312156135d9575f80fd5b84356001600160401b03808211156135ef575f80fd5b6135fb888389016134f6565b9550602091508187013581811115613611575f80fd5b61361d89828a01613565565b955050604087013581811115613631575f80fd5b61363d89828a01613565565b945050606087013581811115613651575f80fd5b87019050601f81018813613663575f80fd5b8035613671613515826134d4565b81815260059190911b8201830190838101908a83111561368f575f80fd5b928401925b828410156136b65783356136a7816132c2565b82529284019290840190613694565b979a9699509497505050505050565b5f805f606084860312156136d7575f80fd5b6136e084613263565b925060208401356136f081613276565b9150604084013561370081613276565b809150509250925092565b5f6020828403121561371b575f80fd5b5035919050565b806104008101831015610804575f80fd5b5f805f6104408486031215613746575f80fd5b833592506137578560208601613722565b91506137666104208501613263565b90509250925092565b5f8060408385031215613780575f80fd5b82356001600160401b0380821115613796575f80fd5b6137a2868387016134f6565b935060208501359150808211156137b7575f80fd5b506137c4858286016134f6565b9150509250929050565b5f6001600160401b038211156137e6576137e6613490565b50601f01601f191660200190565b5f82601f830112613803575f80fd5b8135613811613515826137ce565b818152846020838601011115613825575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f805f6101208a8c03121561385a575f80fd5b6138638a613263565b985060208a013561387381613276565b975061388160408b01613263565b965060608a013561389181613276565b955060808a01356138a181613276565b945060a08a01356001600160401b038111156138bb575f80fd5b6138c78c828d016137f4565b94505060c08a01356138d881613276565b925060e08a01356138e881613276565b91506101008a01356138f9816132c2565b809150509295985092959850929598565b5f806040838503121561391b575f80fd5b823561392681613276565b946020939093013593505050565b5f805f805f60a08688031215613948575f80fd5b61395186613263565b9450602086013561396181613276565b935060408601356001600160401b038082111561397c575f80fd5b61398889838a016137f4565b9450606088013591508082111561399d575f80fd5b506139aa888289016137f4565b92505060808601356139bb81613408565b809150509295509295909350565b5f805f805f8060a087890312156139de575f80fd5b6139e787613263565b955060208701356139f781613276565b9450604087013593506060870135613a0e816132c2565b925060808701356001600160401b03811115613a28575f80fd5b613a3489828a016132cf565b979a9699509497509295939492505050565b5f8060408385031215613a57575f80fd5b8235613a6281613276565b915060208301356132b7816132c2565b5f8060408385031215613a83575f80fd5b613a8c83613263565b9150613a9a60208401613263565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613abf575f80fd5b613ac98e8e613722565b9b50613ad98e6104008f01613722565b9a506108008d013599506108208d013598506108408d01359750613b006108608e01613263565b9650613b106108808e0135613276565b6108808d01359550613b256108a08e01613263565b9450613b356108c08e0135613276565b6108c08d013593506108e08d013592506001600160401b036109008e01351115613b5d575f80fd5b613b6e8e6109008f01358f016132cf565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613b9c575f80fd5b613ba588613263565b96506020880135613bb581613276565b9550604088013594506060880135613bcc81613276565b93506080880135613bdc816132c2565b925060a08801356001600160401b03811115613bf6575f80fd5b613c028a828b016132cf565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613c2a575f80fd5b613c3387613263565b95506020870135613c4381613276565b9450613c5160408801613263565b93506060870135613c6181613276565b92506080870135613c7181613276565b915060a08701356001600160401b03811115613c8b575f80fd5b613c9789828a016137f4565b9150509295509295509295565b5f805f806104608587031215613cb8575f80fd5b84359350613cc98660208701613722565b9250613cd86104208601613263565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c90821680613d2757607f821691505b602082108103613d4557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613d8457613d84613d5f565b5060010190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115610d4a575f81815260208120601f850160051c81016020861015613dff5750805b601f850160051c820191505b8181101561142e57828155600101613e0b565b81516001600160401b03811115613e3757613e37613490565b613e4b81613e458454613d13565b84613dd9565b602080601f831160018114613e7e575f8415613e675750858301515b5f19600386901b1c1916600185901b17855561142e565b5f85815260208120601f198616915b82811015613eac57888601518255948401946001909101908401613e8d565b5085821015613ec957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613eeb60608301866133a9565b8281036020840152613efd81866133a9565b91505060ff83166040830152949350505050565b5f8351613f22818460208801613387565b835190830190613f36818360208801613387565b01949350505050565b808202811582820484141761080457610804613d5f565b8082018082111561080457610804613d5f565b818382375f9101908152919050565b5f8251613f89818460208701613387565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906131bb9083018486613f93565b5f60208284031215614003575f80fd5b5051919050565b8181038181111561080457610804613d5f565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161406e848301876133a9565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906140b79083018486613f93565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916141138483018789613f93565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561413d575f80fd5b81516133e681613408565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b63ffffffff81811683821601908082111561271557612715613d5f565b5f80858511156141be575f80fd5b838611156141ca575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156141ff5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121561421d575f80fd5b873561422881613276565b9650602088013561423881613276565b95506040880135945060608801359350608088013561347381613408565b5f805f805f805f80610100898b03121561426e575f80fd5b883561427981613276565b9750602089013561428981613276565b9650604089013595506060890135945060808901356142a7816132c2565b935060a08901356142b781613408565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561430e57815f19048211156142f4576142f4613d5f565b8085161561430157918102915b93841c93908002906142d9565b509250929050565b5f8261432457506001610804565b8161433057505f610804565b816001811461434657600281146143505761436c565b6001915050610804565b60ff84111561436157614361613d5f565b50506001821b610804565b5060208310610133831016604e8410600b841016171561438f575081810a610804565b61439983836142d4565b805f19048211156143ac576143ac613d5f565b029392505050565b5f6133e68383614316565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156143e3575f80fd5b81516001600160401b038111156143f8575f80fd5b8201601f81018413614408575f80fd5b8051614416613515826137ce565b81815285602083850101111561442a575f80fd5b61443b826020830160208601613387565b95945050505050565b5f60208284031215614454575f80fd5b81516133e6816132c256fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a264697066735822122037f2d9d14450b30ae5085e3e49ec180f0b199039dce098c7f027c2222e9455b264736f6c63430008140033", } // Bridgel2sovereignchainABI is the input ABI used to generate the binding from. @@ -1219,23 +1219,23 @@ func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) MigrateL // RemoveLegacySovereignTokenAddress is a paid mutator transaction binding the contract method 0xb4586962. // -// Solidity: function removeLegacySovereignTokenAddress(address sovereignTokenAddress) returns() -func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactor) RemoveLegacySovereignTokenAddress(opts *bind.TransactOpts, sovereignTokenAddress common.Address) (*types.Transaction, error) { - return _Bridgel2sovereignchain.contract.Transact(opts, "removeLegacySovereignTokenAddress", sovereignTokenAddress) +// Solidity: function removeLegacySovereignTokenAddress(address legacySovereignTokenAddress) returns() +func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactor) RemoveLegacySovereignTokenAddress(opts *bind.TransactOpts, legacySovereignTokenAddress common.Address) (*types.Transaction, error) { + return _Bridgel2sovereignchain.contract.Transact(opts, "removeLegacySovereignTokenAddress", legacySovereignTokenAddress) } // RemoveLegacySovereignTokenAddress is a paid mutator transaction binding the contract method 0xb4586962. // -// Solidity: function removeLegacySovereignTokenAddress(address sovereignTokenAddress) returns() -func (_Bridgel2sovereignchain *Bridgel2sovereignchainSession) RemoveLegacySovereignTokenAddress(sovereignTokenAddress common.Address) (*types.Transaction, error) { - return _Bridgel2sovereignchain.Contract.RemoveLegacySovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, sovereignTokenAddress) +// Solidity: function removeLegacySovereignTokenAddress(address legacySovereignTokenAddress) returns() +func (_Bridgel2sovereignchain *Bridgel2sovereignchainSession) RemoveLegacySovereignTokenAddress(legacySovereignTokenAddress common.Address) (*types.Transaction, error) { + return _Bridgel2sovereignchain.Contract.RemoveLegacySovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, legacySovereignTokenAddress) } // RemoveLegacySovereignTokenAddress is a paid mutator transaction binding the contract method 0xb4586962. // -// Solidity: function removeLegacySovereignTokenAddress(address sovereignTokenAddress) returns() -func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) RemoveLegacySovereignTokenAddress(sovereignTokenAddress common.Address) (*types.Transaction, error) { - return _Bridgel2sovereignchain.Contract.RemoveLegacySovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, sovereignTokenAddress) +// Solidity: function removeLegacySovereignTokenAddress(address legacySovereignTokenAddress) returns() +func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) RemoveLegacySovereignTokenAddress(legacySovereignTokenAddress common.Address) (*types.Transaction, error) { + return _Bridgel2sovereignchain.Contract.RemoveLegacySovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, legacySovereignTokenAddress) } // SetBridgeManager is a paid mutator transaction binding the contract method 0xeabd372a. @@ -1280,27 +1280,6 @@ func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) SetMulti return _Bridgel2sovereignchain.Contract.SetMultipleSovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, originNetworks, originTokenAddresses, sovereignTokenAddresses, isNotMintable) } -// SetSovereignTokenAddress is a paid mutator transaction binding the contract method 0xb42f6b3a. -// -// Solidity: function setSovereignTokenAddress(uint32 originNetwork, address originTokenAddress, address sovereignTokenAddress, bool isNotMintable) returns() -func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactor) SetSovereignTokenAddress(opts *bind.TransactOpts, originNetwork uint32, originTokenAddress common.Address, sovereignTokenAddress common.Address, isNotMintable bool) (*types.Transaction, error) { - return _Bridgel2sovereignchain.contract.Transact(opts, "setSovereignTokenAddress", originNetwork, originTokenAddress, sovereignTokenAddress, isNotMintable) -} - -// SetSovereignTokenAddress is a paid mutator transaction binding the contract method 0xb42f6b3a. -// -// Solidity: function setSovereignTokenAddress(uint32 originNetwork, address originTokenAddress, address sovereignTokenAddress, bool isNotMintable) returns() -func (_Bridgel2sovereignchain *Bridgel2sovereignchainSession) SetSovereignTokenAddress(originNetwork uint32, originTokenAddress common.Address, sovereignTokenAddress common.Address, isNotMintable bool) (*types.Transaction, error) { - return _Bridgel2sovereignchain.Contract.SetSovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, originNetwork, originTokenAddress, sovereignTokenAddress, isNotMintable) -} - -// SetSovereignTokenAddress is a paid mutator transaction binding the contract method 0xb42f6b3a. -// -// Solidity: function setSovereignTokenAddress(uint32 originNetwork, address originTokenAddress, address sovereignTokenAddress, bool isNotMintable) returns() -func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) SetSovereignTokenAddress(originNetwork uint32, originTokenAddress common.Address, sovereignTokenAddress common.Address, isNotMintable bool) (*types.Transaction, error) { - return _Bridgel2sovereignchain.Contract.SetSovereignTokenAddress(&_Bridgel2sovereignchain.TransactOpts, originNetwork, originTokenAddress, sovereignTokenAddress, isNotMintable) -} - // SetSovereignWETHAddress is a paid mutator transaction binding the contract method 0xbf130d7f. // // Solidity: function setSovereignWETHAddress(address sovereignWETHTokenAddress, bool isNotMintable) returns() @@ -1322,6 +1301,27 @@ func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) SetSover return _Bridgel2sovereignchain.Contract.SetSovereignWETHAddress(&_Bridgel2sovereignchain.TransactOpts, sovereignWETHTokenAddress, isNotMintable) } +// UnsetMultipleClaimedBitmap is a paid mutator transaction binding the contract method 0x8781a5c5. +// +// Solidity: function unsetMultipleClaimedBitmap(uint32[] leafIndexes, uint32[] sourceBridgeNetworks) returns() +func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactor) UnsetMultipleClaimedBitmap(opts *bind.TransactOpts, leafIndexes []uint32, sourceBridgeNetworks []uint32) (*types.Transaction, error) { + return _Bridgel2sovereignchain.contract.Transact(opts, "unsetMultipleClaimedBitmap", leafIndexes, sourceBridgeNetworks) +} + +// UnsetMultipleClaimedBitmap is a paid mutator transaction binding the contract method 0x8781a5c5. +// +// Solidity: function unsetMultipleClaimedBitmap(uint32[] leafIndexes, uint32[] sourceBridgeNetworks) returns() +func (_Bridgel2sovereignchain *Bridgel2sovereignchainSession) UnsetMultipleClaimedBitmap(leafIndexes []uint32, sourceBridgeNetworks []uint32) (*types.Transaction, error) { + return _Bridgel2sovereignchain.Contract.UnsetMultipleClaimedBitmap(&_Bridgel2sovereignchain.TransactOpts, leafIndexes, sourceBridgeNetworks) +} + +// UnsetMultipleClaimedBitmap is a paid mutator transaction binding the contract method 0x8781a5c5. +// +// Solidity: function unsetMultipleClaimedBitmap(uint32[] leafIndexes, uint32[] sourceBridgeNetworks) returns() +func (_Bridgel2sovereignchain *Bridgel2sovereignchainTransactorSession) UnsetMultipleClaimedBitmap(leafIndexes []uint32, sourceBridgeNetworks []uint32) (*types.Transaction, error) { + return _Bridgel2sovereignchain.Contract.UnsetMultipleClaimedBitmap(&_Bridgel2sovereignchain.TransactOpts, leafIndexes, sourceBridgeNetworks) +} + // UpdateGlobalExitRoot is a paid mutator transaction binding the contract method 0x79e2cf97. // // Solidity: function updateGlobalExitRoot() returns() @@ -2835,3 +2835,138 @@ func (_Bridgel2sovereignchain *Bridgel2sovereignchainFilterer) ParseSetSovereign event.Raw = log return event, nil } + +// Bridgel2sovereignchainUnsetClaimIterator is returned from FilterUnsetClaim and is used to iterate over the raw logs and unpacked data for UnsetClaim events raised by the Bridgel2sovereignchain contract. +type Bridgel2sovereignchainUnsetClaimIterator struct { + Event *Bridgel2sovereignchainUnsetClaim // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Bridgel2sovereignchainUnsetClaimIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Bridgel2sovereignchainUnsetClaim) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Bridgel2sovereignchainUnsetClaim) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Bridgel2sovereignchainUnsetClaimIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Bridgel2sovereignchainUnsetClaimIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Bridgel2sovereignchainUnsetClaim represents a UnsetClaim event raised by the Bridgel2sovereignchain contract. +type Bridgel2sovereignchainUnsetClaim struct { + LeafIndex uint32 + SourceBridgeNetwork uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnsetClaim is a free log retrieval operation binding the contract event 0x4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a. +// +// Solidity: event UnsetClaim(uint32 leafIndex, uint32 sourceBridgeNetwork) +func (_Bridgel2sovereignchain *Bridgel2sovereignchainFilterer) FilterUnsetClaim(opts *bind.FilterOpts) (*Bridgel2sovereignchainUnsetClaimIterator, error) { + + logs, sub, err := _Bridgel2sovereignchain.contract.FilterLogs(opts, "UnsetClaim") + if err != nil { + return nil, err + } + return &Bridgel2sovereignchainUnsetClaimIterator{contract: _Bridgel2sovereignchain.contract, event: "UnsetClaim", logs: logs, sub: sub}, nil +} + +// WatchUnsetClaim is a free log subscription operation binding the contract event 0x4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a. +// +// Solidity: event UnsetClaim(uint32 leafIndex, uint32 sourceBridgeNetwork) +func (_Bridgel2sovereignchain *Bridgel2sovereignchainFilterer) WatchUnsetClaim(opts *bind.WatchOpts, sink chan<- *Bridgel2sovereignchainUnsetClaim) (event.Subscription, error) { + + logs, sub, err := _Bridgel2sovereignchain.contract.WatchLogs(opts, "UnsetClaim") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Bridgel2sovereignchainUnsetClaim) + if err := _Bridgel2sovereignchain.contract.UnpackLog(event, "UnsetClaim", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnsetClaim is a log parse operation binding the contract event 0x4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a. +// +// Solidity: event UnsetClaim(uint32 leafIndex, uint32 sourceBridgeNetwork) +func (_Bridgel2sovereignchain *Bridgel2sovereignchainFilterer) ParseUnsetClaim(log types.Log) (*Bridgel2sovereignchainUnsetClaim, error) { + event := new(Bridgel2sovereignchainUnsetClaim) + if err := _Bridgel2sovereignchain.contract.UnpackLog(event, "UnsetClaim", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/etherman/smartcontracts/globalexitrootmanagerl2sovereignchain/globalexitrootmanagerl2sovereignchain.go b/etherman/smartcontracts/globalexitrootmanagerl2sovereignchain/globalexitrootmanagerl2sovereignchain.go index e2937979..6d53e391 100644 --- a/etherman/smartcontracts/globalexitrootmanagerl2sovereignchain/globalexitrootmanagerl2sovereignchain.go +++ b/etherman/smartcontracts/globalexitrootmanagerl2sovereignchain/globalexitrootmanagerl2sovereignchain.go @@ -31,8 +31,8 @@ var ( // Globalexitrootmanagerl2sovereignchainMetaData contains all meta data concerning the Globalexitrootmanagerl2sovereignchain contract. var Globalexitrootmanagerl2sovereignchainMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridgeAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"GlobalExitRootAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughGlobalExitRootsInserted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotLastInsertedGlobalExitRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyAllowedContracts\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyGlobalExitRootUpdater\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newGlobalExitRoot\",\"type\":\"bytes32\"}],\"name\":\"InsertGlobalExitRoot\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"removedGlobalExitRoot\",\"type\":\"bytes32\"}],\"name\":\"RemoveLastGlobalExitRoot\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"globalExitRootMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootUpdater\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_globalExitRootUpdater\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_newRoot\",\"type\":\"bytes32\"}],\"name\":\"insertGlobalExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"insertedGERCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRollupExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"gersToRemove\",\"type\":\"bytes32[]\"}],\"name\":\"removeLastGlobalExitRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"newRoot\",\"type\":\"bytes32\"}],\"name\":\"updateExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a060405234801562000010575f80fd5b5060405162000f9838038062000f988339818101604052810190620000369190620001af565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200007c6200008360201b60201c565b50620002bb565b603460019054906101000a900460ff1615620000d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000cd9062000263565b60405180910390fd5b60ff801660345f9054906101000a900460ff1660ff1614620001485760ff60345f6101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516200013f9190620002a0565b60405180910390a15b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000179826200014e565b9050919050565b6200018b816200016d565b811462000196575f80fd5b50565b5f81519050620001a98162000180565b92915050565b5f60208284031215620001c757620001c66200014a565b5b5f620001d68482850162000199565b91505092915050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e6974695f8201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b5f6200024b602783620001df565b91506200025882620001ef565b604082019050919050565b5f6020820190508181035f8301526200027c816200023d565b9050919050565b5f60ff82169050919050565b6200029a8162000283565b82525050565b5f602082019050620002b55f8301846200028f565b92915050565b608051610cbd620002db5f395f81816103b601526106e40152610cbd5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c806357dfb5721161006457806357dfb5721461011b5780637c314ce3146101375780638bd0eb1c14610155578063a3c573eb14610173578063c4d66de81461019157610091565b806301fd90441461009557806312da06b2146100b3578063257b3632146100cf57806333d6247d146100ff575b5f80fd5b61009d6101ad565b6040516100aa91906108ba565b60405180910390f35b6100cd60048036038101906100c89190610905565b6101b3565b005b6100e960048036038101906100e49190610905565b6103a0565b6040516100f69190610948565b60405180910390f35b61011960048036038101906101149190610905565b6103b4565b005b610135600480360381019061013091906109c2565b610443565b005b61013f6106b6565b60405161014c9190610a4c565b60405180910390f35b61015d6106dc565b60405161016a9190610948565b60405180910390f35b61017b6106e2565b6040516101889190610a4c565b60405180910390f35b6101ab60048036038101906101a69190610a8f565b610706565b005b60015481565b5f73ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610272573373ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff161461026d576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102fa565b3373ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f9576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f805f8381526020019081526020015f20540361036b5760355f815461031f90610ae7565b9190508190555f808381526020019081526020015f2081905550807fb1b866fe5fac68e8f1a4ab2520c7a6b493a954934bbd0f054bd91d6674a4c0d560405160405180910390a261039d565b6040517f1f97a58200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f602052805f5260405f205f915090505481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610439576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050565b5f73ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610502573373ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff16146104fd576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61058a565b3373ffffffffffffffffffffffffffffffffffffffff16603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610589576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f6035549050808383905011156105cd576040517f56feb4f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838390508110156106b0575f8484838181106105ee576105ed610b2e565b5b9050602002013590505f805f8381526020019081526020015f20549050838114610644576040517fae765ff600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808381526020019081526020015f205f905560355f81548092919061066990610b5b565b9190505550817f605764d0b65b62ecf05dc90f674a00a2e2531fabaf120fdde65790e407fcb7a260405160405180910390a2505080806106a890610ae7565b9150506105cf565b50505050565b603460029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60355481565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f603460019054906101000a900460ff161590508080156107385750600160345f9054906101000a900460ff1660ff16105b80610766575061074730610880565b1580156107655750600160345f9054906101000a900460ff1660ff16145b5b6107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c90610c02565b60405180910390fd5b600160345f6101000a81548160ff021916908360ff16021790555080156107e2576001603460016101000a81548160ff0219169083151502179055505b81603460026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550801561087c575f603460016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516108739190610c6e565b60405180910390a15b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f819050919050565b6108b4816108a2565b82525050565b5f6020820190506108cd5f8301846108ab565b92915050565b5f80fd5b5f80fd5b6108e4816108a2565b81146108ee575f80fd5b50565b5f813590506108ff816108db565b92915050565b5f6020828403121561091a576109196108d3565b5b5f610927848285016108f1565b91505092915050565b5f819050919050565b61094281610930565b82525050565b5f60208201905061095b5f830184610939565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261098257610981610961565b5b8235905067ffffffffffffffff81111561099f5761099e610965565b5b6020830191508360208202830111156109bb576109ba610969565b5b9250929050565b5f80602083850312156109d8576109d76108d3565b5b5f83013567ffffffffffffffff8111156109f5576109f46108d7565b5b610a018582860161096d565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a3682610a0d565b9050919050565b610a4681610a2c565b82525050565b5f602082019050610a5f5f830184610a3d565b92915050565b610a6e81610a2c565b8114610a78575f80fd5b50565b5f81359050610a8981610a65565b92915050565b5f60208284031215610aa457610aa36108d3565b5b5f610ab184828501610a7b565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610af182610930565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610b2357610b22610aba565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f610b6582610930565b91505f8203610b7757610b76610aba565b5b600182039050919050565b5f82825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c7265615f8201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b5f610bec602e83610b82565b9150610bf782610b92565b604082019050919050565b5f6020820190508181035f830152610c1981610be0565b9050919050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f610c58610c53610c4e84610c20565b610c35565b610c29565b9050919050565b610c6881610c3e565b82525050565b5f602082019050610c815f830184610c5f565b9291505056fea264697066735822122074d4b5710dd22e5484705695828b56da48cad4b79877dd7ffc8ab8c31a8f171e64736f6c63430008140033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridgeAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"GlobalExitRootAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughGlobalExitRootsInserted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotLastInsertedGlobalExitRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyAllowedContracts\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyGlobalExitRootRemover\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyGlobalExitRootUpdater\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newGlobalExitRoot\",\"type\":\"bytes32\"}],\"name\":\"InsertGlobalExitRoot\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"removedGlobalExitRoot\",\"type\":\"bytes32\"}],\"name\":\"RemoveLastGlobalExitRoot\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newGlobalExitRootRemover\",\"type\":\"address\"}],\"name\":\"SetGlobalExitRootRemover\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newGlobalExitRootUpdater\",\"type\":\"address\"}],\"name\":\"SetGlobalExitRootUpdater\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"globalExitRootMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootRemover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootUpdater\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_globalExitRootUpdater\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_globalExitRootRemover\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_newRoot\",\"type\":\"bytes32\"}],\"name\":\"insertGlobalExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"insertedGERCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRollupExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"gersToRemove\",\"type\":\"bytes32[]\"}],\"name\":\"removeLastGlobalExitRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_globalExitRootRemover\",\"type\":\"address\"}],\"name\":\"setGlobalExitRootRemover\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_globalExitRootUpdater\",\"type\":\"address\"}],\"name\":\"setGlobalExitRootUpdater\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"newRoot\",\"type\":\"bytes32\"}],\"name\":\"updateExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a060405234801561000f575f80fd5b5060405161096d38038061096d83398101604081905261002e91610108565b6001600160a01b038116608052610043610049565b50610135565b603454610100900460ff16156100b55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60345460ff90811614610106576034805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610118575f80fd5b81516001600160a01b038116811461012e575f80fd5b9392505050565b6080516108196101545f395f81816101a301526102cb01526108195ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c80636da0e4ab1161006e5780636da0e4ab1461013e5780637c314ce3146101515780638bd0eb1c1461018257806391eb796d1461018b578063a3c573eb1461019e578063d0267f39146101c5575f80fd5b806301fd9044146100b557806312da06b2146100d1578063257b3632146100e657806333d6247d14610105578063485cc9551461011857806357dfb5721461012b575b5f80fd5b6100be60015481565b6040519081526020015b60405180910390f35b6100e46100df36600461069c565b6101d8565b005b6100be6100f436600461069c565b5f6020819052908152604090205481565b6100e461011336600461069c565b6102c0565b6100e46101263660046106ce565b61030e565b6100e46101393660046106ff565b61045e565b6100e461014c36600461076e565b61056a565b60345461016a906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016100c8565b6100be60365481565b60355461016a906001600160a01b031681565b61016a7f000000000000000000000000000000000000000000000000000000000000000081565b6100e46101d336600461076e565b610629565b6034546201000090046001600160a01b03166102135741331461020e576040516363ac7e0d60e11b815260040160405180910390fd5b610244565b6034546201000090046001600160a01b03163314610244576040516363ac7e0d60e11b815260040160405180910390fd5b5f8181526020819052604081205490036102a75760365f8154610266906107a2565b91829055505f8281526020819052604080822092909255905182917fb1b866fe5fac68e8f1a4ab2520c7a6b493a954934bbd0f054bd91d6674a4c0d591a250565b604051630fcbd2c160e11b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103095760405163b49365dd60e01b815260040160405180910390fd5b600155565b603454610100900460ff161580801561032e5750603454600160ff909116105b806103485750303b158015610348575060345460ff166001145b6103af5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6034805460ff1916600117905580156103d2576034805461ff0019166101001790555b6034805462010000600160b01b031916620100006001600160a01b038681169190910291909117909155603580546001600160a01b0319169184169190911790558015610459576034805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6035546001600160a01b031633146104895760405163a34ddeb160e01b815260040160405180910390fd5b603654808211156104ad576040516356feb4f560e01b815260040160405180910390fd5b5f5b82811015610562575f8484838181106104ca576104ca6107ba565b9050602002013590505f805f8381526020019081526020015f205490508381146105075760405163573b2ffb60e11b815260040160405180910390fd5b5f828152602081905260408120558361051f816107ce565b6040519095508391507f605764d0b65b62ecf05dc90f674a00a2e2531fabaf120fdde65790e407fcb7a2905f90a25050808061055a906107a2565b9150506104af565b506036555050565b6034546201000090046001600160a01b03166105a5574133146105a0576040516363ac7e0d60e11b815260040160405180910390fd5b6105d6565b6034546201000090046001600160a01b031633146105d6576040516363ac7e0d60e11b815260040160405180910390fd5b6034805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c905f90a250565b6035546001600160a01b031633146106545760405163a34ddeb160e01b815260040160405180910390fd5b603580546001600160a01b0319166001600160a01b0383169081179091556040517eb4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758905f90a250565b5f602082840312156106ac575f80fd5b5035919050565b80356001600160a01b03811681146106c9575f80fd5b919050565b5f80604083850312156106df575f80fd5b6106e8836106b3565b91506106f6602084016106b3565b90509250929050565b5f8060208385031215610710575f80fd5b823567ffffffffffffffff80821115610727575f80fd5b818501915085601f83011261073a575f80fd5b813581811115610748575f80fd5b8660208260051b850101111561075c575f80fd5b60209290920196919550909350505050565b5f6020828403121561077e575f80fd5b610787826106b3565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016107b3576107b361078e565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f816107dc576107dc61078e565b505f19019056fea264697066735822122028489e152b03d240177e44e3649d90f4b6305fd1183026889eb37073f90b4c3864736f6c63430008140033", } // Globalexitrootmanagerl2sovereignchainABI is the input ABI used to generate the binding from. @@ -264,6 +264,37 @@ func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignch return _Globalexitrootmanagerl2sovereignchain.Contract.GlobalExitRootMap(&_Globalexitrootmanagerl2sovereignchain.CallOpts, arg0) } +// GlobalExitRootRemover is a free data retrieval call binding the contract method 0x91eb796d. +// +// Solidity: function globalExitRootRemover() view returns(address) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainCaller) GlobalExitRootRemover(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Globalexitrootmanagerl2sovereignchain.contract.Call(opts, &out, "globalExitRootRemover") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GlobalExitRootRemover is a free data retrieval call binding the contract method 0x91eb796d. +// +// Solidity: function globalExitRootRemover() view returns(address) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainSession) GlobalExitRootRemover() (common.Address, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.GlobalExitRootRemover(&_Globalexitrootmanagerl2sovereignchain.CallOpts) +} + +// GlobalExitRootRemover is a free data retrieval call binding the contract method 0x91eb796d. +// +// Solidity: function globalExitRootRemover() view returns(address) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainCallerSession) GlobalExitRootRemover() (common.Address, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.GlobalExitRootRemover(&_Globalexitrootmanagerl2sovereignchain.CallOpts) +} + // GlobalExitRootUpdater is a free data retrieval call binding the contract method 0x7c314ce3. // // Solidity: function globalExitRootUpdater() view returns(address) @@ -357,25 +388,25 @@ func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignch return _Globalexitrootmanagerl2sovereignchain.Contract.LastRollupExitRoot(&_Globalexitrootmanagerl2sovereignchain.CallOpts) } -// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. // -// Solidity: function initialize(address _globalExitRootUpdater) returns() -func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactor) Initialize(opts *bind.TransactOpts, _globalExitRootUpdater common.Address) (*types.Transaction, error) { - return _Globalexitrootmanagerl2sovereignchain.contract.Transact(opts, "initialize", _globalExitRootUpdater) +// Solidity: function initialize(address _globalExitRootUpdater, address _globalExitRootRemover) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactor) Initialize(opts *bind.TransactOpts, _globalExitRootUpdater common.Address, _globalExitRootRemover common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.contract.Transact(opts, "initialize", _globalExitRootUpdater, _globalExitRootRemover) } -// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. // -// Solidity: function initialize(address _globalExitRootUpdater) returns() -func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainSession) Initialize(_globalExitRootUpdater common.Address) (*types.Transaction, error) { - return _Globalexitrootmanagerl2sovereignchain.Contract.Initialize(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootUpdater) +// Solidity: function initialize(address _globalExitRootUpdater, address _globalExitRootRemover) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainSession) Initialize(_globalExitRootUpdater common.Address, _globalExitRootRemover common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.Initialize(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootUpdater, _globalExitRootRemover) } -// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. // -// Solidity: function initialize(address _globalExitRootUpdater) returns() -func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactorSession) Initialize(_globalExitRootUpdater common.Address) (*types.Transaction, error) { - return _Globalexitrootmanagerl2sovereignchain.Contract.Initialize(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootUpdater) +// Solidity: function initialize(address _globalExitRootUpdater, address _globalExitRootRemover) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactorSession) Initialize(_globalExitRootUpdater common.Address, _globalExitRootRemover common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.Initialize(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootUpdater, _globalExitRootRemover) } // InsertGlobalExitRoot is a paid mutator transaction binding the contract method 0x12da06b2. @@ -420,6 +451,48 @@ func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignch return _Globalexitrootmanagerl2sovereignchain.Contract.RemoveLastGlobalExitRoots(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, gersToRemove) } +// SetGlobalExitRootRemover is a paid mutator transaction binding the contract method 0xd0267f39. +// +// Solidity: function setGlobalExitRootRemover(address _globalExitRootRemover) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactor) SetGlobalExitRootRemover(opts *bind.TransactOpts, _globalExitRootRemover common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.contract.Transact(opts, "setGlobalExitRootRemover", _globalExitRootRemover) +} + +// SetGlobalExitRootRemover is a paid mutator transaction binding the contract method 0xd0267f39. +// +// Solidity: function setGlobalExitRootRemover(address _globalExitRootRemover) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainSession) SetGlobalExitRootRemover(_globalExitRootRemover common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.SetGlobalExitRootRemover(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootRemover) +} + +// SetGlobalExitRootRemover is a paid mutator transaction binding the contract method 0xd0267f39. +// +// Solidity: function setGlobalExitRootRemover(address _globalExitRootRemover) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactorSession) SetGlobalExitRootRemover(_globalExitRootRemover common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.SetGlobalExitRootRemover(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootRemover) +} + +// SetGlobalExitRootUpdater is a paid mutator transaction binding the contract method 0x6da0e4ab. +// +// Solidity: function setGlobalExitRootUpdater(address _globalExitRootUpdater) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactor) SetGlobalExitRootUpdater(opts *bind.TransactOpts, _globalExitRootUpdater common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.contract.Transact(opts, "setGlobalExitRootUpdater", _globalExitRootUpdater) +} + +// SetGlobalExitRootUpdater is a paid mutator transaction binding the contract method 0x6da0e4ab. +// +// Solidity: function setGlobalExitRootUpdater(address _globalExitRootUpdater) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainSession) SetGlobalExitRootUpdater(_globalExitRootUpdater common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.SetGlobalExitRootUpdater(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootUpdater) +} + +// SetGlobalExitRootUpdater is a paid mutator transaction binding the contract method 0x6da0e4ab. +// +// Solidity: function setGlobalExitRootUpdater(address _globalExitRootUpdater) returns() +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainTransactorSession) SetGlobalExitRootUpdater(_globalExitRootUpdater common.Address) (*types.Transaction, error) { + return _Globalexitrootmanagerl2sovereignchain.Contract.SetGlobalExitRootUpdater(&_Globalexitrootmanagerl2sovereignchain.TransactOpts, _globalExitRootUpdater) +} + // UpdateExitRoot is a paid mutator transaction binding the contract method 0x33d6247d. // // Solidity: function updateExitRoot(bytes32 newRoot) returns() @@ -862,3 +935,291 @@ func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignch event.Raw = log return event, nil } + +// Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator is returned from FilterSetGlobalExitRootRemover and is used to iterate over the raw logs and unpacked data for SetGlobalExitRootRemover events raised by the Globalexitrootmanagerl2sovereignchain contract. +type Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator struct { + Event *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover represents a SetGlobalExitRootRemover event raised by the Globalexitrootmanagerl2sovereignchain contract. +type Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover struct { + NewGlobalExitRootRemover common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetGlobalExitRootRemover is a free log retrieval operation binding the contract event 0x00b4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758. +// +// Solidity: event SetGlobalExitRootRemover(address indexed newGlobalExitRootRemover) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainFilterer) FilterSetGlobalExitRootRemover(opts *bind.FilterOpts, newGlobalExitRootRemover []common.Address) (*Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator, error) { + + var newGlobalExitRootRemoverRule []interface{} + for _, newGlobalExitRootRemoverItem := range newGlobalExitRootRemover { + newGlobalExitRootRemoverRule = append(newGlobalExitRootRemoverRule, newGlobalExitRootRemoverItem) + } + + logs, sub, err := _Globalexitrootmanagerl2sovereignchain.contract.FilterLogs(opts, "SetGlobalExitRootRemover", newGlobalExitRootRemoverRule) + if err != nil { + return nil, err + } + return &Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemoverIterator{contract: _Globalexitrootmanagerl2sovereignchain.contract, event: "SetGlobalExitRootRemover", logs: logs, sub: sub}, nil +} + +// WatchSetGlobalExitRootRemover is a free log subscription operation binding the contract event 0x00b4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758. +// +// Solidity: event SetGlobalExitRootRemover(address indexed newGlobalExitRootRemover) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainFilterer) WatchSetGlobalExitRootRemover(opts *bind.WatchOpts, sink chan<- *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover, newGlobalExitRootRemover []common.Address) (event.Subscription, error) { + + var newGlobalExitRootRemoverRule []interface{} + for _, newGlobalExitRootRemoverItem := range newGlobalExitRootRemover { + newGlobalExitRootRemoverRule = append(newGlobalExitRootRemoverRule, newGlobalExitRootRemoverItem) + } + + logs, sub, err := _Globalexitrootmanagerl2sovereignchain.contract.WatchLogs(opts, "SetGlobalExitRootRemover", newGlobalExitRootRemoverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover) + if err := _Globalexitrootmanagerl2sovereignchain.contract.UnpackLog(event, "SetGlobalExitRootRemover", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSetGlobalExitRootRemover is a log parse operation binding the contract event 0x00b4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758. +// +// Solidity: event SetGlobalExitRootRemover(address indexed newGlobalExitRootRemover) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainFilterer) ParseSetGlobalExitRootRemover(log types.Log) (*Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover, error) { + event := new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootRemover) + if err := _Globalexitrootmanagerl2sovereignchain.contract.UnpackLog(event, "SetGlobalExitRootRemover", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator is returned from FilterSetGlobalExitRootUpdater and is used to iterate over the raw logs and unpacked data for SetGlobalExitRootUpdater events raised by the Globalexitrootmanagerl2sovereignchain contract. +type Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator struct { + Event *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater represents a SetGlobalExitRootUpdater event raised by the Globalexitrootmanagerl2sovereignchain contract. +type Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater struct { + NewGlobalExitRootUpdater common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetGlobalExitRootUpdater is a free log retrieval operation binding the contract event 0x992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c. +// +// Solidity: event SetGlobalExitRootUpdater(address indexed newGlobalExitRootUpdater) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainFilterer) FilterSetGlobalExitRootUpdater(opts *bind.FilterOpts, newGlobalExitRootUpdater []common.Address) (*Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator, error) { + + var newGlobalExitRootUpdaterRule []interface{} + for _, newGlobalExitRootUpdaterItem := range newGlobalExitRootUpdater { + newGlobalExitRootUpdaterRule = append(newGlobalExitRootUpdaterRule, newGlobalExitRootUpdaterItem) + } + + logs, sub, err := _Globalexitrootmanagerl2sovereignchain.contract.FilterLogs(opts, "SetGlobalExitRootUpdater", newGlobalExitRootUpdaterRule) + if err != nil { + return nil, err + } + return &Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdaterIterator{contract: _Globalexitrootmanagerl2sovereignchain.contract, event: "SetGlobalExitRootUpdater", logs: logs, sub: sub}, nil +} + +// WatchSetGlobalExitRootUpdater is a free log subscription operation binding the contract event 0x992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c. +// +// Solidity: event SetGlobalExitRootUpdater(address indexed newGlobalExitRootUpdater) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainFilterer) WatchSetGlobalExitRootUpdater(opts *bind.WatchOpts, sink chan<- *Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater, newGlobalExitRootUpdater []common.Address) (event.Subscription, error) { + + var newGlobalExitRootUpdaterRule []interface{} + for _, newGlobalExitRootUpdaterItem := range newGlobalExitRootUpdater { + newGlobalExitRootUpdaterRule = append(newGlobalExitRootUpdaterRule, newGlobalExitRootUpdaterItem) + } + + logs, sub, err := _Globalexitrootmanagerl2sovereignchain.contract.WatchLogs(opts, "SetGlobalExitRootUpdater", newGlobalExitRootUpdaterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater) + if err := _Globalexitrootmanagerl2sovereignchain.contract.UnpackLog(event, "SetGlobalExitRootUpdater", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSetGlobalExitRootUpdater is a log parse operation binding the contract event 0x992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c. +// +// Solidity: event SetGlobalExitRootUpdater(address indexed newGlobalExitRootUpdater) +func (_Globalexitrootmanagerl2sovereignchain *Globalexitrootmanagerl2sovereignchainFilterer) ParseSetGlobalExitRootUpdater(log types.Log) (*Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater, error) { + event := new(Globalexitrootmanagerl2sovereignchainSetGlobalExitRootUpdater) + if err := _Globalexitrootmanagerl2sovereignchain.contract.UnpackLog(event, "SetGlobalExitRootUpdater", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/etherman/smartcontracts/polygonzkevmbridgev2/polygonzkevmbridgev2.go b/etherman/smartcontracts/polygonzkevmbridgev2/polygonzkevmbridgev2.go new file mode 100644 index 00000000..1eafbae2 --- /dev/null +++ b/etherman/smartcontracts/polygonzkevmbridgev2/polygonzkevmbridgev2.go @@ -0,0 +1,1935 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package polygonzkevmbridgev2 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Polygonzkevmbridgev2MetaData contains all meta data concerning the Polygonzkevmbridgev2 contract. +var Polygonzkevmbridgev2MetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountDoesNotMatchMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DestinationNetworkInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EtherTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedTokenWrappedDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasTokenNetworkMustBeZeroOnEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSmtProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MerkleTreeFull\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MsgValueNotZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeTokenIsEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoValueInMessagesOnGasTokenNetworks\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyRollupManager\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"depositCount\",\"type\":\"uint32\"}],\"name\":\"BridgeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"NewWrappedToken\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_INIT_BYTECODE_WRAPPED_TOKEN\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WETHToken\",\"outputs\":[{\"internalType\":\"contractTokenWrapped\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"permitData\",\"type\":\"bytes\"}],\"name\":\"bridgeAsset\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountWETH\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"forceUpdateGlobalExitRoot\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessageWETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"}],\"name\":\"calculateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"calculateTokenWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimedBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenMetadata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenNetwork\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"name\":\"getLeafValue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenMetadata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"name\":\"getTokenWrappedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_networkID\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_gasTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_gasTokenNetwork\",\"type\":\"uint32\"},{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_polygonRollupManager\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_gasTokenMetadata\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"leafIndex\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"sourceBridgeNetwork\",\"type\":\"uint32\"}],\"name\":\"isClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdatedDepositCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"polygonRollupManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"precalculatedWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tokenInfoToWrappedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateGlobalExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokenToTokenInfo\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61539c80620000ed5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a7578063f5efcd79146105d2578063f811bff7146105f1578063fb57083414610610575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610593575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b5061022161062f565b005b34801561022e575f80fd5b5061024261023d3660046129c1565b610664565b6040516001600160a01b039091168152602001610204565b610221610268366004612a48565b6106b2565b348015610278575f80fd5b50610281610722565b6040516102049190612b0a565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb366004612b23565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004612b4c565b6107ae565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361083a565b3480156103cd575f80fd5b506102426103dc366004612bc6565b610916565b3480156103ec575f80fd5b5061022161093f565b348015610400575f80fd5b5061024261040f366004612c0c565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b50610281610960565b348015610448575f80fd5b506102a3610457366004612c34565b61097f565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b50610242610495366004612d35565b610a54565b3480156104a5575f80fd5b506102216104b4366004612dcb565b610b54565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b50610281610517366004612b23565b610bcd565b348015610527575f80fd5b506101f8610536366004612e49565b610c12565b348015610546575f80fd5b50610221610555366004612e7a565b610c9a565b610221610568366004612f5e565b61109b565b348015610578575f80fd5b5060685461024290600160281b90046001600160a01b031681565b34801561059e575f80fd5b50610221611432565b3480156105b2575f80fd5b506102a36105c1366004612c0c565b60696020525f908152604090205481565b3480156105dd575f80fd5b506102216105ec366004612e7a565b611465565b3480156105fc575f80fd5b5061022161060b366004612fee565b6116c8565b34801561061b575f80fd5b506101f861062a366004613091565b611934565b606c546001600160a01b0316331461065a57604051631736745960e31b815260040160405180910390fd5b61066261194b565b565b5f606a5f848460405160200161067b9291906130d6565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156106d657604051630bc011ff60e21b815260040160405180910390fd5b34158015906106ef5750606f546001600160a01b031615155b1561070d576040516301bd897160e61b815260040160405180910390fd5b61071b8585348686866119a6565b5050505050565b606e805461072f90613100565b80601f016020809104026020016040519081016040528092919081815260200182805461075b90613100565b80156107a65780601f1061077d576101008083540402835291602001916107a6565b820191905f5260205f20905b81548152906001019060200180831161078957829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b602081101561090d578083901c6001166001036108a1576033816020811061086e5761086e613138565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108ce565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061090590613160565b915050610844565b50919392505050565b5f610937848461092585611a70565b61092e86611b2b565b61049587611bdf565b949350505050565b605354606854600160c81b900463ffffffff16101561066257610662611c93565b60405180611ba00160405280611b668152602001613801611b66913981565b5f83815b6020811015610a4b57600163ffffffff8516821c811690036109ee578481602081106109b1576109b1613138565b6020020135826040516020016109d1929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a39565b81858260208110610a0157610a01613138565b6020020135604051602001610a20929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a4381613160565b915050610983565b50949350505050565b5f808686604051602001610a699291906130d6565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613801611b669139898989604051602001610aba93929190613178565b60408051601f1981840301815290829052610ad892916020016131b0565b60405160208183030381529060405280519060200120604051602001610b3094939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b7857604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610ba15760405163dde3cda760e01b815260040160405180910390fd5b606f54610bb7906001600160a01b031685611d27565b610bc58686868686866119a6565b505050505050565b6060610bd882611a70565b610be183611b2b565b610bea84611bdf565b604051602001610bfc93929190613178565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610c37575063ffffffff83166001145b15610c49575063ffffffff8316610c71565b610c5e64010000000063ffffffff85166131de565b610c6e9063ffffffff86166131f5565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cbe57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610cee576040516302caf51760e11b815260040160405180910390fd5b610d218c8c8c8c8c610d1c5f8e8e8e8e8e8e8e604051610d0f929190613208565b60405180910390206107ae565b611d7e565b6001600160a01b038616610e0857606f546001600160a01b0316610dec575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610d77576020820181803683370190505b50604051610d859190613217565b5f6040518083038185875af1925050503d805f8114610dbf576040519150601f19603f3d011682016040523d82523d5f602084013e610dc4565b606091505b5050905080610de657604051630ce8f45160e31b815260040160405180910390fd5b50611031565b606f54610e03906001600160a01b03168585611edc565b611031565b606d546001600160a01b038781169116148015610e365750606d5463ffffffff888116600160a01b90920416145b15610e4d575f6001600160a01b0385168482610d4d565b60685463ffffffff610100909104811690881603610e7957610e036001600160a01b0387168585611f35565b5f8787604051602001610e8d9291906130d6565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680611023575f610f028386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f9d92505050565b9050610f0f818888611edc565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a83888860405161101595949392919061325a565b60405180910390a15061102e565b61102e818787611edc565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156110bf57604051630bc011ff60e21b815260040160405180910390fd5b6110c7612017565b60685463ffffffff6101009091048116908816036110f8576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166111db5788341461112b5760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061115890613100565b80601f016020809104026020016040519081016040528092919081815260200182805461118490613100565b80156111cf5780601f106111a6576101008083540402835291602001916111cf565b820191905f5260205f20905b8154815290600101906020018083116111b257829003601f168201915b505050505091506113a9565b34156111fa5760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b039081169089160361121f5761121a888a611d27565b6113a9565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561127f5761126e898b611d27565b60208101518151909550935061139c565b851561129157611291898b8989612070565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156112d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f99190613292565b90506113106001600160a01b038b1633308e6123ab565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113789190613292565b905061138482826132a9565b6068548c9850610100900463ffffffff169650935050505b6113a589610bcd565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516113e89897969594939291906132bc565b60405180910390a161140e6114095f85878f8f8789805190602001206107ae565b6123e3565b861561141c5761141c611c93565b5050505061142960018055565b50505050505050565b606c546001600160a01b0316331461145d57604051631736745960e31b815260040160405180910390fd5b6106626124cb565b60685460ff161561148957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146114b9576040516302caf51760e11b815260040160405180910390fd5b6114db8c8c8c8c8c610d1c60018e8e8e8e8e8e8e604051610d0f929190613208565b606f545f906001600160a01b031661158e57846001600160a01b031684888a868660405160240161150f9493929190613326565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516115449190613217565b5f6040518083038185875af1925050503d805f811461157e576040519150601f19603f3d011682016040523d82523d5f602084013e611583565b606091505b50508091505061163f565b606f546115a5906001600160a01b03168686611edc565b846001600160a01b0316878985856040516024016115c69493929190613326565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516115fb9190613217565b5f604051808303815f865af19150503d805f8114611634576040519150601f19603f3d011682016040523d82523d5f602084013e611639565b606091505b50909150505b8061165d576040516337e391c360e01b815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff16158080156116e657505f54600160ff909116105b806116ff5750303b1580156116ff57505f5460ff166001145b6117675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611788575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b03191685831617905586166118115763ffffffff85161561180c57604051630d43a60960e11b815260040160405180910390fd5b6118df565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e61184883826133a5565b506118be5f801b60126040516020016118aa91906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052611f9d565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b6118e7612522565b8015611429575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f8161194186868661097f565b1495945050505050565b60685460ff161561196f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff6101009091048116908716036119d7576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611a2b99989796959493929190613461565b60405180910390a1611a626114096001606860019054906101000a900463ffffffff16338a8a8a8989604051610d0f929190613208565b8215610bc557610bc5611c93565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b03861691611ab69190613217565b5f60405180830381855afa9150503d805f8114611aee576040519150601f19603f3d011682016040523d82523d5f602084013e611af3565b606091505b509150915081611b2257604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610937565b61093781612550565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b03861691611b719190613217565b5f60405180830381855afa9150503d805f8114611ba9576040519150601f19603f3d011682016040523d82523d5f602084013e611bae565b606091505b509150915081611b2257604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610937565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691611c249190613217565b5f60405180830381855afa9150503d805f8114611c5c576040519150601f19603f3d011682016040523d82523d5f602084013e611c61565b606091505b5091509150818015611c74575080516020145b611c7f576012610937565b8080602001905181019061093791906134cd565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611cda61083a565b6040518263ffffffff1660e01b8152600401611cf891815260200190565b5f604051808303815f87803b158015611d0f575f80fd5b505af1158015611d21573d5f803e3d5ffd5b50505050565b604051632770a7eb60e21b8152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b158015611d6c575f80fd5b505af1158015610bc5573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af1158015611df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e189190613292565b9050805f03611e3957604051622f6fad60e01b815260040160405180910390fd5b5f8068010000000000000000871615611e7d57869150611e5b848a8489611934565b611e78576040516338105f3b60e21b815260040160405180910390fd5b611ec7565b602087901c611e8d8160016134e8565b9150879250611ea8611ea0868c8661097f565b8a8389611934565b611ec5576040516338105f3b60e21b815260040160405180910390fd5b505b611ed182826126da565b505050505050505050565b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b158015611f23575f80fd5b505af1158015611429573d5f803e3d5ffd5b6040516001600160a01b038316602482015260448101829052611f9890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612781565b505050565b5f8060405180611ba00160405280611b668152602001613801611b66913983604051602001611fcd9291906131b0565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612010576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036120695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161175e565b6002600155565b5f61207e6004828486613505565b6120879161352c565b9050632afa533160e01b6001600160e01b0319821601612216575f8080808080806120b5896004818d613505565b8101906120c2919061355c565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146121025760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301461212b5760405163750643af60e01b815260040160405180910390fd5b8a851461214b576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916121c99190613217565b5f604051808303815f865af19150503d805f8114612202576040519150601f19603f3d011682016040523d82523d5f602084013e612207565b606091505b5050505050505050505061071b565b6001600160e01b031981166323f2ebc360e21b1461224757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808061225c8a6004818e613505565b81019061226991906135ab565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146122ab5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146122d45760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161235b9190613217565b5f604051808303815f865af19150503d805f8114612394576040519150601f19603f3d011682016040523d82523d5f602084013e612399565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611d219085906323b872dd60e01b90608401611f61565b8060016123f260206002613709565b6123fc91906132a9565b6053541061241d576040516377ae67b360e11b815260040160405180910390fd5b5f60535f815461242c90613160565b918290555090505f5b60208110156124bc578082901c60011660010361246857826033826020811061246057612460613138565b015550505050565b6033816020811061247b5761247b613138565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806124b490613160565b915050612435565b50611f98613714565b60018055565b60685460ff166124ee57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff166125485760405162461bcd60e51b815260040161175e90613728565b610662612854565b6060604082511061256f57818060200190518101906106ac9190613773565b81516020036126a7575f5b6020811080156125a9575082818151811061259757612597613138565b01602001516001600160f81b03191615155b156125c057806125b881613160565b91505061257a565b805f036125f75750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f8167ffffffffffffffff81111561261157612611612c70565b6040519080825280601f01601f19166020018201604052801561263b576020820181803683370190505b5090505f5b8281101561269f5784818151811061265a5761265a613138565b602001015160f81c60f81b82828151811061267757612677613138565b60200101906001600160f81b03191690815f1a9053508061269781613160565b915050612640565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b6068545f90610100900463ffffffff161580156126fd575063ffffffff82166001145b1561270f575063ffffffff8216612737565b61272464010000000063ffffffff84166131de565b6127349063ffffffff85166131f5565b90505b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900361142957604051630c8d9eab60e31b815260040160405180910390fd5b5f6127d5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661287a9092919063ffffffff16565b905080515f14806127f55750808060200190518101906127f591906137e5565b611f985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161175e565b5f54610100900460ff166124c55760405162461bcd60e51b815260040161175e90613728565b606061093784845f85855f80866001600160a01b0316858760405161289f9190613217565b5f6040518083038185875af1925050503d805f81146128d9576040519150601f19603f3d011682016040523d82523d5f602084013e6128de565b606091505b50915091506128ef878383876128fa565b979650505050505050565b606083156129685782515f03612961576001600160a01b0385163b6129615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161175e565b5081610937565b610937838381511561297d5781518083602001fd5b8060405162461bcd60e51b815260040161175e9190612b0a565b803563ffffffff811681146126d5575f80fd5b6001600160a01b03811681146129be575f80fd5b50565b5f80604083850312156129d2575f80fd5b6129db83612997565b915060208301356129eb816129aa565b809150509250929050565b80151581146129be575f80fd5b5f8083601f840112612a13575f80fd5b50813567ffffffffffffffff811115612a2a575f80fd5b602083019150836020828501011115612a41575f80fd5b9250929050565b5f805f805f60808688031215612a5c575f80fd5b612a6586612997565b94506020860135612a75816129aa565b93506040860135612a85816129f6565b9250606086013567ffffffffffffffff811115612aa0575f80fd5b612aac88828901612a03565b969995985093965092949392505050565b5f5b83811015612ad7578181015183820152602001612abf565b50505f910152565b5f8151808452612af6816020860160208601612abd565b601f01601f19169290920160200192915050565b602081525f612b1c6020830184612adf565b9392505050565b5f60208284031215612b33575f80fd5b8135612b1c816129aa565b60ff811681146129be575f80fd5b5f805f805f805f60e0888a031215612b62575f80fd5b8735612b6d81612b3e565b9650612b7b60208901612997565b95506040880135612b8b816129aa565b9450612b9960608901612997565b93506080880135612ba9816129aa565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215612bd8575f80fd5b612be184612997565b92506020840135612bf1816129aa565b91506040840135612c01816129aa565b809150509250925092565b5f60208284031215612c1c575f80fd5b5035919050565b8061040081018310156106ac575f80fd5b5f805f6104408486031215612c47575f80fd5b83359250612c588560208601612c23565b9150612c676104208501612997565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612cad57612cad612c70565b604052919050565b5f67ffffffffffffffff821115612cce57612cce612c70565b50601f01601f191660200190565b5f612cee612ce984612cb5565b612c84565b9050828152838383011115612d01575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612d26575f80fd5b612b1c83833560208501612cdc565b5f805f805f60a08688031215612d49575f80fd5b612d5286612997565b94506020860135612d62816129aa565b9350604086013567ffffffffffffffff80821115612d7e575f80fd5b612d8a89838a01612d17565b94506060880135915080821115612d9f575f80fd5b50612dac88828901612d17565b9250506080860135612dbd81612b3e565b809150509295509295909350565b5f805f805f8060a08789031215612de0575f80fd5b612de987612997565b95506020870135612df9816129aa565b9450604087013593506060870135612e10816129f6565b9250608087013567ffffffffffffffff811115612e2b575f80fd5b612e3789828a01612a03565b979a9699509497509295939492505050565b5f8060408385031215612e5a575f80fd5b612e6383612997565b9150612e7160208401612997565b90509250929050565b5f805f805f805f805f805f806109208d8f031215612e96575f80fd5b612ea08e8e612c23565b9b50612eb08e6104008f01612c23565b9a506108008d013599506108208d013598506108408d01359750612ed76108608e01612997565b9650612ee76108808e01356129aa565b6108808d01359550612efc6108a08e01612997565b9450612f0c6108c08e01356129aa565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e01351115612f35575f80fd5b612f468e6109008f01358f01612a03565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215612f74575f80fd5b612f7d88612997565b96506020880135612f8d816129aa565b9550604088013594506060880135612fa4816129aa565b93506080880135612fb4816129f6565b925060a088013567ffffffffffffffff811115612fcf575f80fd5b612fdb8a828b01612a03565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613003575f80fd5b61300c87612997565b9550602087013561301c816129aa565b945061302a60408801612997565b9350606087013561303a816129aa565b9250608087013561304a816129aa565b915060a087013567ffffffffffffffff811115613065575f80fd5b8701601f81018913613075575f80fd5b61308489823560208401612cdc565b9150509295509295509295565b5f805f8061046085870312156130a5575f80fd5b843593506130b68660208701612c23565b92506130c56104208601612997565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061311457607f821691505b60208210810361313257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016131715761317161314c565b5060010190565b606081525f61318a6060830186612adf565b828103602084015261319c8186612adf565b91505060ff83166040830152949350505050565b5f83516131c1818460208801612abd565b8351908301906131d5818360208801612abd565b01949350505050565b80820281158282048414176106ac576106ac61314c565b808201808211156106ac576106ac61314c565b818382375f9101908152919050565b5f8251613228818460208701612abd565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906128ef9083018486613232565b5f602082840312156132a2575f80fd5b5051919050565b818103818111156106ac576106ac61314c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161330d84830187612adf565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906133569083018486613232565b9695505050505050565b601f821115611f98575f81815260208120601f850160051c810160208610156133865750805b601f850160051c820191505b81811015610bc557828155600101613392565b815167ffffffffffffffff8111156133bf576133bf612c70565b6133d3816133cd8454613100565b84613360565b602080601f831160018114613406575f84156133ef5750858301515b5f19600386901b1c1916600185901b178555610bc5565b5f85815260208120601f198616915b8281101561343457888601518255948401946001909101908401613415565b508582101561345157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916134b38483018789613232565b925080851660e085015250509a9950505050505050505050565b5f602082840312156134dd575f80fd5b8151612b1c81612b3e565b63ffffffff8181168382160190808211156120105761201061314c565b5f8085851115613513575f80fd5b8386111561351f575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156135545780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613572575f80fd5b873561357d816129aa565b9650602088013561358d816129aa565b955060408801359450606088013593506080880135612ba981612b3e565b5f805f805f805f80610100898b0312156135c3575f80fd5b88356135ce816129aa565b975060208901356135de816129aa565b9650604089013595506060890135945060808901356135fc816129f6565b935060a089013561360c81612b3e565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561366357815f19048211156136495761364961314c565b8085161561365657918102915b93841c939080029061362e565b509250929050565b5f82613679575060016106ac565b8161368557505f6106ac565b816001811461369b57600281146136a5576136c1565b60019150506106ac565b60ff8411156136b6576136b661314c565b50506001821b6106ac565b5060208310610133831016604e8410600b84101617156136e4575081810a6106ac565b6136ee8383613629565b805f19048211156137015761370161314c565b029392505050565b5f612b1c838361366b565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215613783575f80fd5b815167ffffffffffffffff811115613799575f80fd5b8201601f810184136137a9575f80fd5b80516137b7612ce982612cb5565b8181528560208385010111156137cb575f80fd5b6137dc826020830160208601612abd565b95945050505050565b5f602082840312156137f5575f80fd5b8151612b1c816129f656fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220f2a5cdf63dbf1cd3d440e3a4168a6977d8b149080d045c04198da4c5a4c8e22c64736f6c63430008140033", +} + +// Polygonzkevmbridgev2ABI is the input ABI used to generate the binding from. +// Deprecated: Use Polygonzkevmbridgev2MetaData.ABI instead. +var Polygonzkevmbridgev2ABI = Polygonzkevmbridgev2MetaData.ABI + +// Polygonzkevmbridgev2Bin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use Polygonzkevmbridgev2MetaData.Bin instead. +var Polygonzkevmbridgev2Bin = Polygonzkevmbridgev2MetaData.Bin + +// DeployPolygonzkevmbridgev2 deploys a new Ethereum contract, binding an instance of Polygonzkevmbridgev2 to it. +func DeployPolygonzkevmbridgev2(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Polygonzkevmbridgev2, error) { + parsed, err := Polygonzkevmbridgev2MetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Polygonzkevmbridgev2Bin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Polygonzkevmbridgev2{Polygonzkevmbridgev2Caller: Polygonzkevmbridgev2Caller{contract: contract}, Polygonzkevmbridgev2Transactor: Polygonzkevmbridgev2Transactor{contract: contract}, Polygonzkevmbridgev2Filterer: Polygonzkevmbridgev2Filterer{contract: contract}}, nil +} + +// Polygonzkevmbridgev2 is an auto generated Go binding around an Ethereum contract. +type Polygonzkevmbridgev2 struct { + Polygonzkevmbridgev2Caller // Read-only binding to the contract + Polygonzkevmbridgev2Transactor // Write-only binding to the contract + Polygonzkevmbridgev2Filterer // Log filterer for contract events +} + +// Polygonzkevmbridgev2Caller is an auto generated read-only Go binding around an Ethereum contract. +type Polygonzkevmbridgev2Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Polygonzkevmbridgev2Transactor is an auto generated write-only Go binding around an Ethereum contract. +type Polygonzkevmbridgev2Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Polygonzkevmbridgev2Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Polygonzkevmbridgev2Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Polygonzkevmbridgev2Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Polygonzkevmbridgev2Session struct { + Contract *Polygonzkevmbridgev2 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Polygonzkevmbridgev2CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Polygonzkevmbridgev2CallerSession struct { + Contract *Polygonzkevmbridgev2Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Polygonzkevmbridgev2TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Polygonzkevmbridgev2TransactorSession struct { + Contract *Polygonzkevmbridgev2Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Polygonzkevmbridgev2Raw is an auto generated low-level Go binding around an Ethereum contract. +type Polygonzkevmbridgev2Raw struct { + Contract *Polygonzkevmbridgev2 // Generic contract binding to access the raw methods on +} + +// Polygonzkevmbridgev2CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Polygonzkevmbridgev2CallerRaw struct { + Contract *Polygonzkevmbridgev2Caller // Generic read-only contract binding to access the raw methods on +} + +// Polygonzkevmbridgev2TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Polygonzkevmbridgev2TransactorRaw struct { + Contract *Polygonzkevmbridgev2Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewPolygonzkevmbridgev2 creates a new instance of Polygonzkevmbridgev2, bound to a specific deployed contract. +func NewPolygonzkevmbridgev2(address common.Address, backend bind.ContractBackend) (*Polygonzkevmbridgev2, error) { + contract, err := bindPolygonzkevmbridgev2(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2{Polygonzkevmbridgev2Caller: Polygonzkevmbridgev2Caller{contract: contract}, Polygonzkevmbridgev2Transactor: Polygonzkevmbridgev2Transactor{contract: contract}, Polygonzkevmbridgev2Filterer: Polygonzkevmbridgev2Filterer{contract: contract}}, nil +} + +// NewPolygonzkevmbridgev2Caller creates a new read-only instance of Polygonzkevmbridgev2, bound to a specific deployed contract. +func NewPolygonzkevmbridgev2Caller(address common.Address, caller bind.ContractCaller) (*Polygonzkevmbridgev2Caller, error) { + contract, err := bindPolygonzkevmbridgev2(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2Caller{contract: contract}, nil +} + +// NewPolygonzkevmbridgev2Transactor creates a new write-only instance of Polygonzkevmbridgev2, bound to a specific deployed contract. +func NewPolygonzkevmbridgev2Transactor(address common.Address, transactor bind.ContractTransactor) (*Polygonzkevmbridgev2Transactor, error) { + contract, err := bindPolygonzkevmbridgev2(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2Transactor{contract: contract}, nil +} + +// NewPolygonzkevmbridgev2Filterer creates a new log filterer instance of Polygonzkevmbridgev2, bound to a specific deployed contract. +func NewPolygonzkevmbridgev2Filterer(address common.Address, filterer bind.ContractFilterer) (*Polygonzkevmbridgev2Filterer, error) { + contract, err := bindPolygonzkevmbridgev2(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2Filterer{contract: contract}, nil +} + +// bindPolygonzkevmbridgev2 binds a generic wrapper to an already deployed contract. +func bindPolygonzkevmbridgev2(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Polygonzkevmbridgev2MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Polygonzkevmbridgev2.Contract.Polygonzkevmbridgev2Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.Polygonzkevmbridgev2Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.Polygonzkevmbridgev2Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Polygonzkevmbridgev2.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.contract.Transact(opts, method, params...) +} + +// BASEINITBYTECODEWRAPPEDTOKEN is a free data retrieval call binding the contract method 0x83c43a55. +// +// Solidity: function BASE_INIT_BYTECODE_WRAPPED_TOKEN() view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) BASEINITBYTECODEWRAPPEDTOKEN(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "BASE_INIT_BYTECODE_WRAPPED_TOKEN") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// BASEINITBYTECODEWRAPPEDTOKEN is a free data retrieval call binding the contract method 0x83c43a55. +// +// Solidity: function BASE_INIT_BYTECODE_WRAPPED_TOKEN() view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) BASEINITBYTECODEWRAPPEDTOKEN() ([]byte, error) { + return _Polygonzkevmbridgev2.Contract.BASEINITBYTECODEWRAPPEDTOKEN(&_Polygonzkevmbridgev2.CallOpts) +} + +// BASEINITBYTECODEWRAPPEDTOKEN is a free data retrieval call binding the contract method 0x83c43a55. +// +// Solidity: function BASE_INIT_BYTECODE_WRAPPED_TOKEN() view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) BASEINITBYTECODEWRAPPEDTOKEN() ([]byte, error) { + return _Polygonzkevmbridgev2.Contract.BASEINITBYTECODEWRAPPEDTOKEN(&_Polygonzkevmbridgev2.CallOpts) +} + +// WETHToken is a free data retrieval call binding the contract method 0x4b2f336d. +// +// Solidity: function WETHToken() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) WETHToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "WETHToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WETHToken is a free data retrieval call binding the contract method 0x4b2f336d. +// +// Solidity: function WETHToken() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) WETHToken() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.WETHToken(&_Polygonzkevmbridgev2.CallOpts) +} + +// WETHToken is a free data retrieval call binding the contract method 0x4b2f336d. +// +// Solidity: function WETHToken() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) WETHToken() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.WETHToken(&_Polygonzkevmbridgev2.CallOpts) +} + +// CalculateRoot is a free data retrieval call binding the contract method 0x83f24403. +// +// Solidity: function calculateRoot(bytes32 leafHash, bytes32[32] smtProof, uint32 index) pure returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) CalculateRoot(opts *bind.CallOpts, leafHash [32]byte, smtProof [32][32]byte, index uint32) ([32]byte, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "calculateRoot", leafHash, smtProof, index) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateRoot is a free data retrieval call binding the contract method 0x83f24403. +// +// Solidity: function calculateRoot(bytes32 leafHash, bytes32[32] smtProof, uint32 index) pure returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) CalculateRoot(leafHash [32]byte, smtProof [32][32]byte, index uint32) ([32]byte, error) { + return _Polygonzkevmbridgev2.Contract.CalculateRoot(&_Polygonzkevmbridgev2.CallOpts, leafHash, smtProof, index) +} + +// CalculateRoot is a free data retrieval call binding the contract method 0x83f24403. +// +// Solidity: function calculateRoot(bytes32 leafHash, bytes32[32] smtProof, uint32 index) pure returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) CalculateRoot(leafHash [32]byte, smtProof [32][32]byte, index uint32) ([32]byte, error) { + return _Polygonzkevmbridgev2.Contract.CalculateRoot(&_Polygonzkevmbridgev2.CallOpts, leafHash, smtProof, index) +} + +// CalculateTokenWrapperAddress is a free data retrieval call binding the contract method 0x7843298b. +// +// Solidity: function calculateTokenWrapperAddress(uint32 originNetwork, address originTokenAddress, address token) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) CalculateTokenWrapperAddress(opts *bind.CallOpts, originNetwork uint32, originTokenAddress common.Address, token common.Address) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "calculateTokenWrapperAddress", originNetwork, originTokenAddress, token) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// CalculateTokenWrapperAddress is a free data retrieval call binding the contract method 0x7843298b. +// +// Solidity: function calculateTokenWrapperAddress(uint32 originNetwork, address originTokenAddress, address token) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) CalculateTokenWrapperAddress(originNetwork uint32, originTokenAddress common.Address, token common.Address) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.CalculateTokenWrapperAddress(&_Polygonzkevmbridgev2.CallOpts, originNetwork, originTokenAddress, token) +} + +// CalculateTokenWrapperAddress is a free data retrieval call binding the contract method 0x7843298b. +// +// Solidity: function calculateTokenWrapperAddress(uint32 originNetwork, address originTokenAddress, address token) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) CalculateTokenWrapperAddress(originNetwork uint32, originTokenAddress common.Address, token common.Address) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.CalculateTokenWrapperAddress(&_Polygonzkevmbridgev2.CallOpts, originNetwork, originTokenAddress, token) +} + +// ClaimedBitMap is a free data retrieval call binding the contract method 0xee25560b. +// +// Solidity: function claimedBitMap(uint256 ) view returns(uint256) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) ClaimedBitMap(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "claimedBitMap", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ClaimedBitMap is a free data retrieval call binding the contract method 0xee25560b. +// +// Solidity: function claimedBitMap(uint256 ) view returns(uint256) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) ClaimedBitMap(arg0 *big.Int) (*big.Int, error) { + return _Polygonzkevmbridgev2.Contract.ClaimedBitMap(&_Polygonzkevmbridgev2.CallOpts, arg0) +} + +// ClaimedBitMap is a free data retrieval call binding the contract method 0xee25560b. +// +// Solidity: function claimedBitMap(uint256 ) view returns(uint256) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) ClaimedBitMap(arg0 *big.Int) (*big.Int, error) { + return _Polygonzkevmbridgev2.Contract.ClaimedBitMap(&_Polygonzkevmbridgev2.CallOpts, arg0) +} + +// DepositCount is a free data retrieval call binding the contract method 0x2dfdf0b5. +// +// Solidity: function depositCount() view returns(uint256) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) DepositCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "depositCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// DepositCount is a free data retrieval call binding the contract method 0x2dfdf0b5. +// +// Solidity: function depositCount() view returns(uint256) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) DepositCount() (*big.Int, error) { + return _Polygonzkevmbridgev2.Contract.DepositCount(&_Polygonzkevmbridgev2.CallOpts) +} + +// DepositCount is a free data retrieval call binding the contract method 0x2dfdf0b5. +// +// Solidity: function depositCount() view returns(uint256) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) DepositCount() (*big.Int, error) { + return _Polygonzkevmbridgev2.Contract.DepositCount(&_Polygonzkevmbridgev2.CallOpts) +} + +// GasTokenAddress is a free data retrieval call binding the contract method 0x3c351e10. +// +// Solidity: function gasTokenAddress() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GasTokenAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "gasTokenAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GasTokenAddress is a free data retrieval call binding the contract method 0x3c351e10. +// +// Solidity: function gasTokenAddress() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GasTokenAddress() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.GasTokenAddress(&_Polygonzkevmbridgev2.CallOpts) +} + +// GasTokenAddress is a free data retrieval call binding the contract method 0x3c351e10. +// +// Solidity: function gasTokenAddress() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GasTokenAddress() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.GasTokenAddress(&_Polygonzkevmbridgev2.CallOpts) +} + +// GasTokenMetadata is a free data retrieval call binding the contract method 0x27aef4e8. +// +// Solidity: function gasTokenMetadata() view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GasTokenMetadata(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "gasTokenMetadata") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GasTokenMetadata is a free data retrieval call binding the contract method 0x27aef4e8. +// +// Solidity: function gasTokenMetadata() view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GasTokenMetadata() ([]byte, error) { + return _Polygonzkevmbridgev2.Contract.GasTokenMetadata(&_Polygonzkevmbridgev2.CallOpts) +} + +// GasTokenMetadata is a free data retrieval call binding the contract method 0x27aef4e8. +// +// Solidity: function gasTokenMetadata() view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GasTokenMetadata() ([]byte, error) { + return _Polygonzkevmbridgev2.Contract.GasTokenMetadata(&_Polygonzkevmbridgev2.CallOpts) +} + +// GasTokenNetwork is a free data retrieval call binding the contract method 0x3cbc795b. +// +// Solidity: function gasTokenNetwork() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GasTokenNetwork(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "gasTokenNetwork") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// GasTokenNetwork is a free data retrieval call binding the contract method 0x3cbc795b. +// +// Solidity: function gasTokenNetwork() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GasTokenNetwork() (uint32, error) { + return _Polygonzkevmbridgev2.Contract.GasTokenNetwork(&_Polygonzkevmbridgev2.CallOpts) +} + +// GasTokenNetwork is a free data retrieval call binding the contract method 0x3cbc795b. +// +// Solidity: function gasTokenNetwork() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GasTokenNetwork() (uint32, error) { + return _Polygonzkevmbridgev2.Contract.GasTokenNetwork(&_Polygonzkevmbridgev2.CallOpts) +} + +// GetLeafValue is a free data retrieval call binding the contract method 0x3e197043. +// +// Solidity: function getLeafValue(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes32 metadataHash) pure returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GetLeafValue(opts *bind.CallOpts, leafType uint8, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadataHash [32]byte) ([32]byte, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "getLeafValue", leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadataHash) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetLeafValue is a free data retrieval call binding the contract method 0x3e197043. +// +// Solidity: function getLeafValue(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes32 metadataHash) pure returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GetLeafValue(leafType uint8, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadataHash [32]byte) ([32]byte, error) { + return _Polygonzkevmbridgev2.Contract.GetLeafValue(&_Polygonzkevmbridgev2.CallOpts, leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadataHash) +} + +// GetLeafValue is a free data retrieval call binding the contract method 0x3e197043. +// +// Solidity: function getLeafValue(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes32 metadataHash) pure returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GetLeafValue(leafType uint8, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadataHash [32]byte) ([32]byte, error) { + return _Polygonzkevmbridgev2.Contract.GetLeafValue(&_Polygonzkevmbridgev2.CallOpts, leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadataHash) +} + +// GetRoot is a free data retrieval call binding the contract method 0x5ca1e165. +// +// Solidity: function getRoot() view returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GetRoot(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "getRoot") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoot is a free data retrieval call binding the contract method 0x5ca1e165. +// +// Solidity: function getRoot() view returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GetRoot() ([32]byte, error) { + return _Polygonzkevmbridgev2.Contract.GetRoot(&_Polygonzkevmbridgev2.CallOpts) +} + +// GetRoot is a free data retrieval call binding the contract method 0x5ca1e165. +// +// Solidity: function getRoot() view returns(bytes32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GetRoot() ([32]byte, error) { + return _Polygonzkevmbridgev2.Contract.GetRoot(&_Polygonzkevmbridgev2.CallOpts) +} + +// GetTokenMetadata is a free data retrieval call binding the contract method 0xc00f14ab. +// +// Solidity: function getTokenMetadata(address token) view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GetTokenMetadata(opts *bind.CallOpts, token common.Address) ([]byte, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "getTokenMetadata", token) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetTokenMetadata is a free data retrieval call binding the contract method 0xc00f14ab. +// +// Solidity: function getTokenMetadata(address token) view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GetTokenMetadata(token common.Address) ([]byte, error) { + return _Polygonzkevmbridgev2.Contract.GetTokenMetadata(&_Polygonzkevmbridgev2.CallOpts, token) +} + +// GetTokenMetadata is a free data retrieval call binding the contract method 0xc00f14ab. +// +// Solidity: function getTokenMetadata(address token) view returns(bytes) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GetTokenMetadata(token common.Address) ([]byte, error) { + return _Polygonzkevmbridgev2.Contract.GetTokenMetadata(&_Polygonzkevmbridgev2.CallOpts, token) +} + +// GetTokenWrappedAddress is a free data retrieval call binding the contract method 0x22e95f2c. +// +// Solidity: function getTokenWrappedAddress(uint32 originNetwork, address originTokenAddress) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GetTokenWrappedAddress(opts *bind.CallOpts, originNetwork uint32, originTokenAddress common.Address) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "getTokenWrappedAddress", originNetwork, originTokenAddress) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetTokenWrappedAddress is a free data retrieval call binding the contract method 0x22e95f2c. +// +// Solidity: function getTokenWrappedAddress(uint32 originNetwork, address originTokenAddress) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GetTokenWrappedAddress(originNetwork uint32, originTokenAddress common.Address) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.GetTokenWrappedAddress(&_Polygonzkevmbridgev2.CallOpts, originNetwork, originTokenAddress) +} + +// GetTokenWrappedAddress is a free data retrieval call binding the contract method 0x22e95f2c. +// +// Solidity: function getTokenWrappedAddress(uint32 originNetwork, address originTokenAddress) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GetTokenWrappedAddress(originNetwork uint32, originTokenAddress common.Address) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.GetTokenWrappedAddress(&_Polygonzkevmbridgev2.CallOpts, originNetwork, originTokenAddress) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) GlobalExitRootManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "globalExitRootManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) GlobalExitRootManager() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.GlobalExitRootManager(&_Polygonzkevmbridgev2.CallOpts) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) GlobalExitRootManager() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.GlobalExitRootManager(&_Polygonzkevmbridgev2.CallOpts) +} + +// IsClaimed is a free data retrieval call binding the contract method 0xcc461632. +// +// Solidity: function isClaimed(uint32 leafIndex, uint32 sourceBridgeNetwork) view returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) IsClaimed(opts *bind.CallOpts, leafIndex uint32, sourceBridgeNetwork uint32) (bool, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "isClaimed", leafIndex, sourceBridgeNetwork) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsClaimed is a free data retrieval call binding the contract method 0xcc461632. +// +// Solidity: function isClaimed(uint32 leafIndex, uint32 sourceBridgeNetwork) view returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) IsClaimed(leafIndex uint32, sourceBridgeNetwork uint32) (bool, error) { + return _Polygonzkevmbridgev2.Contract.IsClaimed(&_Polygonzkevmbridgev2.CallOpts, leafIndex, sourceBridgeNetwork) +} + +// IsClaimed is a free data retrieval call binding the contract method 0xcc461632. +// +// Solidity: function isClaimed(uint32 leafIndex, uint32 sourceBridgeNetwork) view returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) IsClaimed(leafIndex uint32, sourceBridgeNetwork uint32) (bool, error) { + return _Polygonzkevmbridgev2.Contract.IsClaimed(&_Polygonzkevmbridgev2.CallOpts, leafIndex, sourceBridgeNetwork) +} + +// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. +// +// Solidity: function isEmergencyState() view returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) IsEmergencyState(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "isEmergencyState") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. +// +// Solidity: function isEmergencyState() view returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) IsEmergencyState() (bool, error) { + return _Polygonzkevmbridgev2.Contract.IsEmergencyState(&_Polygonzkevmbridgev2.CallOpts) +} + +// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. +// +// Solidity: function isEmergencyState() view returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) IsEmergencyState() (bool, error) { + return _Polygonzkevmbridgev2.Contract.IsEmergencyState(&_Polygonzkevmbridgev2.CallOpts) +} + +// LastUpdatedDepositCount is a free data retrieval call binding the contract method 0xbe5831c7. +// +// Solidity: function lastUpdatedDepositCount() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) LastUpdatedDepositCount(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "lastUpdatedDepositCount") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// LastUpdatedDepositCount is a free data retrieval call binding the contract method 0xbe5831c7. +// +// Solidity: function lastUpdatedDepositCount() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) LastUpdatedDepositCount() (uint32, error) { + return _Polygonzkevmbridgev2.Contract.LastUpdatedDepositCount(&_Polygonzkevmbridgev2.CallOpts) +} + +// LastUpdatedDepositCount is a free data retrieval call binding the contract method 0xbe5831c7. +// +// Solidity: function lastUpdatedDepositCount() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) LastUpdatedDepositCount() (uint32, error) { + return _Polygonzkevmbridgev2.Contract.LastUpdatedDepositCount(&_Polygonzkevmbridgev2.CallOpts) +} + +// NetworkID is a free data retrieval call binding the contract method 0xbab161bf. +// +// Solidity: function networkID() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) NetworkID(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "networkID") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// NetworkID is a free data retrieval call binding the contract method 0xbab161bf. +// +// Solidity: function networkID() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) NetworkID() (uint32, error) { + return _Polygonzkevmbridgev2.Contract.NetworkID(&_Polygonzkevmbridgev2.CallOpts) +} + +// NetworkID is a free data retrieval call binding the contract method 0xbab161bf. +// +// Solidity: function networkID() view returns(uint32) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) NetworkID() (uint32, error) { + return _Polygonzkevmbridgev2.Contract.NetworkID(&_Polygonzkevmbridgev2.CallOpts) +} + +// PolygonRollupManager is a free data retrieval call binding the contract method 0x8ed7e3f2. +// +// Solidity: function polygonRollupManager() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) PolygonRollupManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "polygonRollupManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PolygonRollupManager is a free data retrieval call binding the contract method 0x8ed7e3f2. +// +// Solidity: function polygonRollupManager() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) PolygonRollupManager() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.PolygonRollupManager(&_Polygonzkevmbridgev2.CallOpts) +} + +// PolygonRollupManager is a free data retrieval call binding the contract method 0x8ed7e3f2. +// +// Solidity: function polygonRollupManager() view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) PolygonRollupManager() (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.PolygonRollupManager(&_Polygonzkevmbridgev2.CallOpts) +} + +// PrecalculatedWrapperAddress is a free data retrieval call binding the contract method 0xaaa13cc2. +// +// Solidity: function precalculatedWrapperAddress(uint32 originNetwork, address originTokenAddress, string name, string symbol, uint8 decimals) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) PrecalculatedWrapperAddress(opts *bind.CallOpts, originNetwork uint32, originTokenAddress common.Address, name string, symbol string, decimals uint8) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "precalculatedWrapperAddress", originNetwork, originTokenAddress, name, symbol, decimals) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PrecalculatedWrapperAddress is a free data retrieval call binding the contract method 0xaaa13cc2. +// +// Solidity: function precalculatedWrapperAddress(uint32 originNetwork, address originTokenAddress, string name, string symbol, uint8 decimals) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) PrecalculatedWrapperAddress(originNetwork uint32, originTokenAddress common.Address, name string, symbol string, decimals uint8) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.PrecalculatedWrapperAddress(&_Polygonzkevmbridgev2.CallOpts, originNetwork, originTokenAddress, name, symbol, decimals) +} + +// PrecalculatedWrapperAddress is a free data retrieval call binding the contract method 0xaaa13cc2. +// +// Solidity: function precalculatedWrapperAddress(uint32 originNetwork, address originTokenAddress, string name, string symbol, uint8 decimals) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) PrecalculatedWrapperAddress(originNetwork uint32, originTokenAddress common.Address, name string, symbol string, decimals uint8) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.PrecalculatedWrapperAddress(&_Polygonzkevmbridgev2.CallOpts, originNetwork, originTokenAddress, name, symbol, decimals) +} + +// TokenInfoToWrappedToken is a free data retrieval call binding the contract method 0x81b1c174. +// +// Solidity: function tokenInfoToWrappedToken(bytes32 ) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) TokenInfoToWrappedToken(opts *bind.CallOpts, arg0 [32]byte) (common.Address, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "tokenInfoToWrappedToken", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TokenInfoToWrappedToken is a free data retrieval call binding the contract method 0x81b1c174. +// +// Solidity: function tokenInfoToWrappedToken(bytes32 ) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) TokenInfoToWrappedToken(arg0 [32]byte) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.TokenInfoToWrappedToken(&_Polygonzkevmbridgev2.CallOpts, arg0) +} + +// TokenInfoToWrappedToken is a free data retrieval call binding the contract method 0x81b1c174. +// +// Solidity: function tokenInfoToWrappedToken(bytes32 ) view returns(address) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) TokenInfoToWrappedToken(arg0 [32]byte) (common.Address, error) { + return _Polygonzkevmbridgev2.Contract.TokenInfoToWrappedToken(&_Polygonzkevmbridgev2.CallOpts, arg0) +} + +// VerifyMerkleProof is a free data retrieval call binding the contract method 0xfb570834. +// +// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[32] smtProof, uint32 index, bytes32 root) pure returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) VerifyMerkleProof(opts *bind.CallOpts, leafHash [32]byte, smtProof [32][32]byte, index uint32, root [32]byte) (bool, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "verifyMerkleProof", leafHash, smtProof, index, root) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// VerifyMerkleProof is a free data retrieval call binding the contract method 0xfb570834. +// +// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[32] smtProof, uint32 index, bytes32 root) pure returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) VerifyMerkleProof(leafHash [32]byte, smtProof [32][32]byte, index uint32, root [32]byte) (bool, error) { + return _Polygonzkevmbridgev2.Contract.VerifyMerkleProof(&_Polygonzkevmbridgev2.CallOpts, leafHash, smtProof, index, root) +} + +// VerifyMerkleProof is a free data retrieval call binding the contract method 0xfb570834. +// +// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[32] smtProof, uint32 index, bytes32 root) pure returns(bool) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) VerifyMerkleProof(leafHash [32]byte, smtProof [32][32]byte, index uint32, root [32]byte) (bool, error) { + return _Polygonzkevmbridgev2.Contract.VerifyMerkleProof(&_Polygonzkevmbridgev2.CallOpts, leafHash, smtProof, index, root) +} + +// WrappedTokenToTokenInfo is a free data retrieval call binding the contract method 0x318aee3d. +// +// Solidity: function wrappedTokenToTokenInfo(address ) view returns(uint32 originNetwork, address originTokenAddress) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Caller) WrappedTokenToTokenInfo(opts *bind.CallOpts, arg0 common.Address) (struct { + OriginNetwork uint32 + OriginTokenAddress common.Address +}, error) { + var out []interface{} + err := _Polygonzkevmbridgev2.contract.Call(opts, &out, "wrappedTokenToTokenInfo", arg0) + + outstruct := new(struct { + OriginNetwork uint32 + OriginTokenAddress common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.OriginNetwork = *abi.ConvertType(out[0], new(uint32)).(*uint32) + outstruct.OriginTokenAddress = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// WrappedTokenToTokenInfo is a free data retrieval call binding the contract method 0x318aee3d. +// +// Solidity: function wrappedTokenToTokenInfo(address ) view returns(uint32 originNetwork, address originTokenAddress) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) WrappedTokenToTokenInfo(arg0 common.Address) (struct { + OriginNetwork uint32 + OriginTokenAddress common.Address +}, error) { + return _Polygonzkevmbridgev2.Contract.WrappedTokenToTokenInfo(&_Polygonzkevmbridgev2.CallOpts, arg0) +} + +// WrappedTokenToTokenInfo is a free data retrieval call binding the contract method 0x318aee3d. +// +// Solidity: function wrappedTokenToTokenInfo(address ) view returns(uint32 originNetwork, address originTokenAddress) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2CallerSession) WrappedTokenToTokenInfo(arg0 common.Address) (struct { + OriginNetwork uint32 + OriginTokenAddress common.Address +}, error) { + return _Polygonzkevmbridgev2.Contract.WrappedTokenToTokenInfo(&_Polygonzkevmbridgev2.CallOpts, arg0) +} + +// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x2072f6c5. +// +// Solidity: function activateEmergencyState() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) ActivateEmergencyState(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "activateEmergencyState") +} + +// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x2072f6c5. +// +// Solidity: function activateEmergencyState() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) ActivateEmergencyState() (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.ActivateEmergencyState(&_Polygonzkevmbridgev2.TransactOpts) +} + +// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x2072f6c5. +// +// Solidity: function activateEmergencyState() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) ActivateEmergencyState() (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.ActivateEmergencyState(&_Polygonzkevmbridgev2.TransactOpts) +} + +// BridgeAsset is a paid mutator transaction binding the contract method 0xcd586579. +// +// Solidity: function bridgeAsset(uint32 destinationNetwork, address destinationAddress, uint256 amount, address token, bool forceUpdateGlobalExitRoot, bytes permitData) payable returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) BridgeAsset(opts *bind.TransactOpts, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, token common.Address, forceUpdateGlobalExitRoot bool, permitData []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "bridgeAsset", destinationNetwork, destinationAddress, amount, token, forceUpdateGlobalExitRoot, permitData) +} + +// BridgeAsset is a paid mutator transaction binding the contract method 0xcd586579. +// +// Solidity: function bridgeAsset(uint32 destinationNetwork, address destinationAddress, uint256 amount, address token, bool forceUpdateGlobalExitRoot, bytes permitData) payable returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) BridgeAsset(destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, token common.Address, forceUpdateGlobalExitRoot bool, permitData []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.BridgeAsset(&_Polygonzkevmbridgev2.TransactOpts, destinationNetwork, destinationAddress, amount, token, forceUpdateGlobalExitRoot, permitData) +} + +// BridgeAsset is a paid mutator transaction binding the contract method 0xcd586579. +// +// Solidity: function bridgeAsset(uint32 destinationNetwork, address destinationAddress, uint256 amount, address token, bool forceUpdateGlobalExitRoot, bytes permitData) payable returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) BridgeAsset(destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, token common.Address, forceUpdateGlobalExitRoot bool, permitData []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.BridgeAsset(&_Polygonzkevmbridgev2.TransactOpts, destinationNetwork, destinationAddress, amount, token, forceUpdateGlobalExitRoot, permitData) +} + +// BridgeMessage is a paid mutator transaction binding the contract method 0x240ff378. +// +// Solidity: function bridgeMessage(uint32 destinationNetwork, address destinationAddress, bool forceUpdateGlobalExitRoot, bytes metadata) payable returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) BridgeMessage(opts *bind.TransactOpts, destinationNetwork uint32, destinationAddress common.Address, forceUpdateGlobalExitRoot bool, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "bridgeMessage", destinationNetwork, destinationAddress, forceUpdateGlobalExitRoot, metadata) +} + +// BridgeMessage is a paid mutator transaction binding the contract method 0x240ff378. +// +// Solidity: function bridgeMessage(uint32 destinationNetwork, address destinationAddress, bool forceUpdateGlobalExitRoot, bytes metadata) payable returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) BridgeMessage(destinationNetwork uint32, destinationAddress common.Address, forceUpdateGlobalExitRoot bool, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.BridgeMessage(&_Polygonzkevmbridgev2.TransactOpts, destinationNetwork, destinationAddress, forceUpdateGlobalExitRoot, metadata) +} + +// BridgeMessage is a paid mutator transaction binding the contract method 0x240ff378. +// +// Solidity: function bridgeMessage(uint32 destinationNetwork, address destinationAddress, bool forceUpdateGlobalExitRoot, bytes metadata) payable returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) BridgeMessage(destinationNetwork uint32, destinationAddress common.Address, forceUpdateGlobalExitRoot bool, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.BridgeMessage(&_Polygonzkevmbridgev2.TransactOpts, destinationNetwork, destinationAddress, forceUpdateGlobalExitRoot, metadata) +} + +// BridgeMessageWETH is a paid mutator transaction binding the contract method 0xb8b284d0. +// +// Solidity: function bridgeMessageWETH(uint32 destinationNetwork, address destinationAddress, uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) BridgeMessageWETH(opts *bind.TransactOpts, destinationNetwork uint32, destinationAddress common.Address, amountWETH *big.Int, forceUpdateGlobalExitRoot bool, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "bridgeMessageWETH", destinationNetwork, destinationAddress, amountWETH, forceUpdateGlobalExitRoot, metadata) +} + +// BridgeMessageWETH is a paid mutator transaction binding the contract method 0xb8b284d0. +// +// Solidity: function bridgeMessageWETH(uint32 destinationNetwork, address destinationAddress, uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) BridgeMessageWETH(destinationNetwork uint32, destinationAddress common.Address, amountWETH *big.Int, forceUpdateGlobalExitRoot bool, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.BridgeMessageWETH(&_Polygonzkevmbridgev2.TransactOpts, destinationNetwork, destinationAddress, amountWETH, forceUpdateGlobalExitRoot, metadata) +} + +// BridgeMessageWETH is a paid mutator transaction binding the contract method 0xb8b284d0. +// +// Solidity: function bridgeMessageWETH(uint32 destinationNetwork, address destinationAddress, uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) BridgeMessageWETH(destinationNetwork uint32, destinationAddress common.Address, amountWETH *big.Int, forceUpdateGlobalExitRoot bool, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.BridgeMessageWETH(&_Polygonzkevmbridgev2.TransactOpts, destinationNetwork, destinationAddress, amountWETH, forceUpdateGlobalExitRoot, metadata) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xccaa2d11. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) ClaimAsset(opts *bind.TransactOpts, smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "claimAsset", smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xccaa2d11. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) ClaimAsset(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.ClaimAsset(&_Polygonzkevmbridgev2.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xccaa2d11. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) ClaimAsset(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.ClaimAsset(&_Polygonzkevmbridgev2.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0xf5efcd79. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) ClaimMessage(opts *bind.TransactOpts, smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "claimMessage", smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0xf5efcd79. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) ClaimMessage(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.ClaimMessage(&_Polygonzkevmbridgev2.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0xf5efcd79. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) ClaimMessage(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.ClaimMessage(&_Polygonzkevmbridgev2.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. +// +// Solidity: function deactivateEmergencyState() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) DeactivateEmergencyState(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "deactivateEmergencyState") +} + +// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. +// +// Solidity: function deactivateEmergencyState() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) DeactivateEmergencyState() (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.DeactivateEmergencyState(&_Polygonzkevmbridgev2.TransactOpts) +} + +// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. +// +// Solidity: function deactivateEmergencyState() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) DeactivateEmergencyState() (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.DeactivateEmergencyState(&_Polygonzkevmbridgev2.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xf811bff7. +// +// Solidity: function initialize(uint32 _networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, address _globalExitRootManager, address _polygonRollupManager, bytes _gasTokenMetadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) Initialize(opts *bind.TransactOpts, _networkID uint32, _gasTokenAddress common.Address, _gasTokenNetwork uint32, _globalExitRootManager common.Address, _polygonRollupManager common.Address, _gasTokenMetadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "initialize", _networkID, _gasTokenAddress, _gasTokenNetwork, _globalExitRootManager, _polygonRollupManager, _gasTokenMetadata) +} + +// Initialize is a paid mutator transaction binding the contract method 0xf811bff7. +// +// Solidity: function initialize(uint32 _networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, address _globalExitRootManager, address _polygonRollupManager, bytes _gasTokenMetadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) Initialize(_networkID uint32, _gasTokenAddress common.Address, _gasTokenNetwork uint32, _globalExitRootManager common.Address, _polygonRollupManager common.Address, _gasTokenMetadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.Initialize(&_Polygonzkevmbridgev2.TransactOpts, _networkID, _gasTokenAddress, _gasTokenNetwork, _globalExitRootManager, _polygonRollupManager, _gasTokenMetadata) +} + +// Initialize is a paid mutator transaction binding the contract method 0xf811bff7. +// +// Solidity: function initialize(uint32 _networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, address _globalExitRootManager, address _polygonRollupManager, bytes _gasTokenMetadata) returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) Initialize(_networkID uint32, _gasTokenAddress common.Address, _gasTokenNetwork uint32, _globalExitRootManager common.Address, _polygonRollupManager common.Address, _gasTokenMetadata []byte) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.Initialize(&_Polygonzkevmbridgev2.TransactOpts, _networkID, _gasTokenAddress, _gasTokenNetwork, _globalExitRootManager, _polygonRollupManager, _gasTokenMetadata) +} + +// UpdateGlobalExitRoot is a paid mutator transaction binding the contract method 0x79e2cf97. +// +// Solidity: function updateGlobalExitRoot() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Transactor) UpdateGlobalExitRoot(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Polygonzkevmbridgev2.contract.Transact(opts, "updateGlobalExitRoot") +} + +// UpdateGlobalExitRoot is a paid mutator transaction binding the contract method 0x79e2cf97. +// +// Solidity: function updateGlobalExitRoot() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Session) UpdateGlobalExitRoot() (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.UpdateGlobalExitRoot(&_Polygonzkevmbridgev2.TransactOpts) +} + +// UpdateGlobalExitRoot is a paid mutator transaction binding the contract method 0x79e2cf97. +// +// Solidity: function updateGlobalExitRoot() returns() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2TransactorSession) UpdateGlobalExitRoot() (*types.Transaction, error) { + return _Polygonzkevmbridgev2.Contract.UpdateGlobalExitRoot(&_Polygonzkevmbridgev2.TransactOpts) +} + +// Polygonzkevmbridgev2BridgeEventIterator is returned from FilterBridgeEvent and is used to iterate over the raw logs and unpacked data for BridgeEvent events raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2BridgeEventIterator struct { + Event *Polygonzkevmbridgev2BridgeEvent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Polygonzkevmbridgev2BridgeEventIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2BridgeEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2BridgeEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Polygonzkevmbridgev2BridgeEventIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Polygonzkevmbridgev2BridgeEventIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Polygonzkevmbridgev2BridgeEvent represents a BridgeEvent event raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2BridgeEvent struct { + LeafType uint8 + OriginNetwork uint32 + OriginAddress common.Address + DestinationNetwork uint32 + DestinationAddress common.Address + Amount *big.Int + Metadata []byte + DepositCount uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBridgeEvent is a free log retrieval operation binding the contract event 0x501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b. +// +// Solidity: event BridgeEvent(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, uint32 depositCount) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) FilterBridgeEvent(opts *bind.FilterOpts) (*Polygonzkevmbridgev2BridgeEventIterator, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.FilterLogs(opts, "BridgeEvent") + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2BridgeEventIterator{contract: _Polygonzkevmbridgev2.contract, event: "BridgeEvent", logs: logs, sub: sub}, nil +} + +// WatchBridgeEvent is a free log subscription operation binding the contract event 0x501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b. +// +// Solidity: event BridgeEvent(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, uint32 depositCount) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) WatchBridgeEvent(opts *bind.WatchOpts, sink chan<- *Polygonzkevmbridgev2BridgeEvent) (event.Subscription, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.WatchLogs(opts, "BridgeEvent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Polygonzkevmbridgev2BridgeEvent) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "BridgeEvent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBridgeEvent is a log parse operation binding the contract event 0x501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b. +// +// Solidity: event BridgeEvent(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, uint32 depositCount) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) ParseBridgeEvent(log types.Log) (*Polygonzkevmbridgev2BridgeEvent, error) { + event := new(Polygonzkevmbridgev2BridgeEvent) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "BridgeEvent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Polygonzkevmbridgev2ClaimEventIterator is returned from FilterClaimEvent and is used to iterate over the raw logs and unpacked data for ClaimEvent events raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2ClaimEventIterator struct { + Event *Polygonzkevmbridgev2ClaimEvent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Polygonzkevmbridgev2ClaimEventIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2ClaimEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2ClaimEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Polygonzkevmbridgev2ClaimEventIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Polygonzkevmbridgev2ClaimEventIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Polygonzkevmbridgev2ClaimEvent represents a ClaimEvent event raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2ClaimEvent struct { + GlobalIndex *big.Int + OriginNetwork uint32 + OriginAddress common.Address + DestinationAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterClaimEvent is a free log retrieval operation binding the contract event 0x1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d. +// +// Solidity: event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) FilterClaimEvent(opts *bind.FilterOpts) (*Polygonzkevmbridgev2ClaimEventIterator, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.FilterLogs(opts, "ClaimEvent") + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2ClaimEventIterator{contract: _Polygonzkevmbridgev2.contract, event: "ClaimEvent", logs: logs, sub: sub}, nil +} + +// WatchClaimEvent is a free log subscription operation binding the contract event 0x1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d. +// +// Solidity: event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) WatchClaimEvent(opts *bind.WatchOpts, sink chan<- *Polygonzkevmbridgev2ClaimEvent) (event.Subscription, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.WatchLogs(opts, "ClaimEvent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Polygonzkevmbridgev2ClaimEvent) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "ClaimEvent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseClaimEvent is a log parse operation binding the contract event 0x1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d. +// +// Solidity: event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) ParseClaimEvent(log types.Log) (*Polygonzkevmbridgev2ClaimEvent, error) { + event := new(Polygonzkevmbridgev2ClaimEvent) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "ClaimEvent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Polygonzkevmbridgev2EmergencyStateActivatedIterator is returned from FilterEmergencyStateActivated and is used to iterate over the raw logs and unpacked data for EmergencyStateActivated events raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2EmergencyStateActivatedIterator struct { + Event *Polygonzkevmbridgev2EmergencyStateActivated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Polygonzkevmbridgev2EmergencyStateActivatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2EmergencyStateActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2EmergencyStateActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Polygonzkevmbridgev2EmergencyStateActivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Polygonzkevmbridgev2EmergencyStateActivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Polygonzkevmbridgev2EmergencyStateActivated represents a EmergencyStateActivated event raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2EmergencyStateActivated struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEmergencyStateActivated is a free log retrieval operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. +// +// Solidity: event EmergencyStateActivated() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) FilterEmergencyStateActivated(opts *bind.FilterOpts) (*Polygonzkevmbridgev2EmergencyStateActivatedIterator, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.FilterLogs(opts, "EmergencyStateActivated") + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2EmergencyStateActivatedIterator{contract: _Polygonzkevmbridgev2.contract, event: "EmergencyStateActivated", logs: logs, sub: sub}, nil +} + +// WatchEmergencyStateActivated is a free log subscription operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. +// +// Solidity: event EmergencyStateActivated() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) WatchEmergencyStateActivated(opts *bind.WatchOpts, sink chan<- *Polygonzkevmbridgev2EmergencyStateActivated) (event.Subscription, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.WatchLogs(opts, "EmergencyStateActivated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Polygonzkevmbridgev2EmergencyStateActivated) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "EmergencyStateActivated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEmergencyStateActivated is a log parse operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. +// +// Solidity: event EmergencyStateActivated() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) ParseEmergencyStateActivated(log types.Log) (*Polygonzkevmbridgev2EmergencyStateActivated, error) { + event := new(Polygonzkevmbridgev2EmergencyStateActivated) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "EmergencyStateActivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Polygonzkevmbridgev2EmergencyStateDeactivatedIterator is returned from FilterEmergencyStateDeactivated and is used to iterate over the raw logs and unpacked data for EmergencyStateDeactivated events raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2EmergencyStateDeactivatedIterator struct { + Event *Polygonzkevmbridgev2EmergencyStateDeactivated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Polygonzkevmbridgev2EmergencyStateDeactivatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2EmergencyStateDeactivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2EmergencyStateDeactivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Polygonzkevmbridgev2EmergencyStateDeactivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Polygonzkevmbridgev2EmergencyStateDeactivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Polygonzkevmbridgev2EmergencyStateDeactivated represents a EmergencyStateDeactivated event raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2EmergencyStateDeactivated struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEmergencyStateDeactivated is a free log retrieval operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. +// +// Solidity: event EmergencyStateDeactivated() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) FilterEmergencyStateDeactivated(opts *bind.FilterOpts) (*Polygonzkevmbridgev2EmergencyStateDeactivatedIterator, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.FilterLogs(opts, "EmergencyStateDeactivated") + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2EmergencyStateDeactivatedIterator{contract: _Polygonzkevmbridgev2.contract, event: "EmergencyStateDeactivated", logs: logs, sub: sub}, nil +} + +// WatchEmergencyStateDeactivated is a free log subscription operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. +// +// Solidity: event EmergencyStateDeactivated() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) WatchEmergencyStateDeactivated(opts *bind.WatchOpts, sink chan<- *Polygonzkevmbridgev2EmergencyStateDeactivated) (event.Subscription, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.WatchLogs(opts, "EmergencyStateDeactivated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Polygonzkevmbridgev2EmergencyStateDeactivated) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "EmergencyStateDeactivated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEmergencyStateDeactivated is a log parse operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. +// +// Solidity: event EmergencyStateDeactivated() +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) ParseEmergencyStateDeactivated(log types.Log) (*Polygonzkevmbridgev2EmergencyStateDeactivated, error) { + event := new(Polygonzkevmbridgev2EmergencyStateDeactivated) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "EmergencyStateDeactivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Polygonzkevmbridgev2InitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2InitializedIterator struct { + Event *Polygonzkevmbridgev2Initialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Polygonzkevmbridgev2InitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2Initialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2Initialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Polygonzkevmbridgev2InitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Polygonzkevmbridgev2InitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Polygonzkevmbridgev2Initialized represents a Initialized event raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2Initialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) FilterInitialized(opts *bind.FilterOpts) (*Polygonzkevmbridgev2InitializedIterator, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2InitializedIterator{contract: _Polygonzkevmbridgev2.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *Polygonzkevmbridgev2Initialized) (event.Subscription, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Polygonzkevmbridgev2Initialized) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) ParseInitialized(log types.Log) (*Polygonzkevmbridgev2Initialized, error) { + event := new(Polygonzkevmbridgev2Initialized) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Polygonzkevmbridgev2NewWrappedTokenIterator is returned from FilterNewWrappedToken and is used to iterate over the raw logs and unpacked data for NewWrappedToken events raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2NewWrappedTokenIterator struct { + Event *Polygonzkevmbridgev2NewWrappedToken // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Polygonzkevmbridgev2NewWrappedTokenIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2NewWrappedToken) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Polygonzkevmbridgev2NewWrappedToken) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Polygonzkevmbridgev2NewWrappedTokenIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Polygonzkevmbridgev2NewWrappedTokenIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Polygonzkevmbridgev2NewWrappedToken represents a NewWrappedToken event raised by the Polygonzkevmbridgev2 contract. +type Polygonzkevmbridgev2NewWrappedToken struct { + OriginNetwork uint32 + OriginTokenAddress common.Address + WrappedTokenAddress common.Address + Metadata []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewWrappedToken is a free log retrieval operation binding the contract event 0x490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a39. +// +// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress, bytes metadata) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) FilterNewWrappedToken(opts *bind.FilterOpts) (*Polygonzkevmbridgev2NewWrappedTokenIterator, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.FilterLogs(opts, "NewWrappedToken") + if err != nil { + return nil, err + } + return &Polygonzkevmbridgev2NewWrappedTokenIterator{contract: _Polygonzkevmbridgev2.contract, event: "NewWrappedToken", logs: logs, sub: sub}, nil +} + +// WatchNewWrappedToken is a free log subscription operation binding the contract event 0x490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a39. +// +// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress, bytes metadata) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) WatchNewWrappedToken(opts *bind.WatchOpts, sink chan<- *Polygonzkevmbridgev2NewWrappedToken) (event.Subscription, error) { + + logs, sub, err := _Polygonzkevmbridgev2.contract.WatchLogs(opts, "NewWrappedToken") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Polygonzkevmbridgev2NewWrappedToken) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "NewWrappedToken", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNewWrappedToken is a log parse operation binding the contract event 0x490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a39. +// +// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress, bytes metadata) +func (_Polygonzkevmbridgev2 *Polygonzkevmbridgev2Filterer) ParseNewWrappedToken(log types.Log) (*Polygonzkevmbridgev2NewWrappedToken, error) { + event := new(Polygonzkevmbridgev2NewWrappedToken) + if err := _Polygonzkevmbridgev2.contract.UnpackLog(event, "NewWrappedToken", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/etherman/smartcontracts/script.sh b/etherman/smartcontracts/script.sh index a0db2051..35ea5fbf 100755 --- a/etherman/smartcontracts/script.sh +++ b/etherman/smartcontracts/script.sh @@ -21,3 +21,4 @@ compilegen() { gen claimcompressor gen globalexitrootmanagerl2sovereignchain gen bridgel2sovereignchain +gen polygonzkevmbridgev2 diff --git a/etherman/types.go b/etherman/types.go index 01288190..806181d6 100644 --- a/etherman/types.go +++ b/etherman/types.go @@ -15,6 +15,7 @@ type Block struct { ParentHash common.Hash NetworkID uint32 GlobalExitRoots []GlobalExitRoot + RemoveL2GER []GlobalExitRoot Deposits []Deposit Claims []Claim Tokens []TokenWrapped diff --git a/server/interfaces.go b/server/interfaces.go index 94a82901..8e708e2d 100644 --- a/server/interfaces.go +++ b/server/interfaces.go @@ -13,7 +13,7 @@ type bridgeServiceStorage interface { GetRoot(ctx context.Context, depositCnt, network uint32, dbTx pgx.Tx) ([]byte, error) GetDepositCountByRoot(ctx context.Context, root []byte, network uint32, dbTx pgx.Tx) (uint32, error) GetLatestExitRoot(ctx context.Context, networkID, destNetwork uint32, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) - GetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) + GetL1ExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) GetClaim(ctx context.Context, index, originNetworkID, networkID uint32, dbTx pgx.Tx) (*etherman.Claim, error) GetClaims(ctx context.Context, destAddr string, limit, offset uint32, dbTx pgx.Tx) ([]*etherman.Claim, error) GetClaimCount(ctx context.Context, destAddr string, dbTx pgx.Tx) (uint64, error) diff --git a/server/mock_bridgeServiceStorage.go b/server/mock_bridgeServiceStorage.go index 0241c3c1..8f4650b1 100644 --- a/server/mock_bridgeServiceStorage.go +++ b/server/mock_bridgeServiceStorage.go @@ -509,12 +509,12 @@ func (_c *bridgeServiceStorageMock_GetDeposits_Call) RunAndReturn(run func(conte return _c } -// GetExitRootByGER provides a mock function with given fields: ctx, ger, dbTx -func (_m *bridgeServiceStorageMock) GetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) { +// GetL1ExitRootByGER provides a mock function with given fields: ctx, ger, dbTx +func (_m *bridgeServiceStorageMock) GetL1ExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) { ret := _m.Called(ctx, ger, dbTx) if len(ret) == 0 { - panic("no return value specified for GetExitRootByGER") + panic("no return value specified for GetL1ExitRootByGER") } var r0 *etherman.GlobalExitRoot @@ -539,32 +539,32 @@ func (_m *bridgeServiceStorageMock) GetExitRootByGER(ctx context.Context, ger co return r0, r1 } -// bridgeServiceStorageMock_GetExitRootByGER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetExitRootByGER' -type bridgeServiceStorageMock_GetExitRootByGER_Call struct { +// bridgeServiceStorageMock_GetL1ExitRootByGER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1ExitRootByGER' +type bridgeServiceStorageMock_GetL1ExitRootByGER_Call struct { *mock.Call } -// GetExitRootByGER is a helper method to define mock.On call +// GetL1ExitRootByGER is a helper method to define mock.On call // - ctx context.Context // - ger common.Hash // - dbTx pgx.Tx -func (_e *bridgeServiceStorageMock_Expecter) GetExitRootByGER(ctx interface{}, ger interface{}, dbTx interface{}) *bridgeServiceStorageMock_GetExitRootByGER_Call { - return &bridgeServiceStorageMock_GetExitRootByGER_Call{Call: _e.mock.On("GetExitRootByGER", ctx, ger, dbTx)} +func (_e *bridgeServiceStorageMock_Expecter) GetL1ExitRootByGER(ctx interface{}, ger interface{}, dbTx interface{}) *bridgeServiceStorageMock_GetL1ExitRootByGER_Call { + return &bridgeServiceStorageMock_GetL1ExitRootByGER_Call{Call: _e.mock.On("GetL1ExitRootByGER", ctx, ger, dbTx)} } -func (_c *bridgeServiceStorageMock_GetExitRootByGER_Call) Run(run func(ctx context.Context, ger common.Hash, dbTx pgx.Tx)) *bridgeServiceStorageMock_GetExitRootByGER_Call { +func (_c *bridgeServiceStorageMock_GetL1ExitRootByGER_Call) Run(run func(ctx context.Context, ger common.Hash, dbTx pgx.Tx)) *bridgeServiceStorageMock_GetL1ExitRootByGER_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(common.Hash), args[2].(pgx.Tx)) }) return _c } -func (_c *bridgeServiceStorageMock_GetExitRootByGER_Call) Return(_a0 *etherman.GlobalExitRoot, _a1 error) *bridgeServiceStorageMock_GetExitRootByGER_Call { +func (_c *bridgeServiceStorageMock_GetL1ExitRootByGER_Call) Return(_a0 *etherman.GlobalExitRoot, _a1 error) *bridgeServiceStorageMock_GetL1ExitRootByGER_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *bridgeServiceStorageMock_GetExitRootByGER_Call) RunAndReturn(run func(context.Context, common.Hash, pgx.Tx) (*etherman.GlobalExitRoot, error)) *bridgeServiceStorageMock_GetExitRootByGER_Call { +func (_c *bridgeServiceStorageMock_GetL1ExitRootByGER_Call) RunAndReturn(run func(context.Context, common.Hash, pgx.Tx) (*etherman.GlobalExitRoot, error)) *bridgeServiceStorageMock_GetL1ExitRootByGER_Call { _c.Call.Return(run) return _c } diff --git a/server/service.go b/server/service.go index cd556f44..aae2d445 100644 --- a/server/service.go +++ b/server/service.go @@ -210,7 +210,7 @@ func (s *bridgeService) GetClaimProofbyGER(depositCnt, networkID uint32, GER com } } - globalExitRoot, err := s.storage.GetExitRootByGER(ctx, GER, dbTx) + globalExitRoot, err := s.storage.GetL1ExitRootByGER(ctx, GER, dbTx) if err != nil { err = fmt.Errorf("error getting GlobalExitRoot data for GER: %s. Err: %w", GER.String(), err) return nil, nil, nil, err @@ -259,7 +259,7 @@ func (s *bridgeService) GetClaimProofForCompressed(ger common.Hash, depositCnt, } } - globalExitRoot, err := s.storage.GetExitRootByGER(ctx, ger, dbTx) + globalExitRoot, err := s.storage.GetL1ExitRootByGER(ctx, ger, dbTx) if err != nil { return nil, nil, nil, err } diff --git a/server/service_test.go b/server/service_test.go index 8ec0be91..bc449d73 100644 --- a/server/service_test.go +++ b/server/service_test.go @@ -25,7 +25,7 @@ func TestGetClaimProofbyGER(t *testing.T) { exitRoot := etherman.GlobalExitRoot{ ExitRoots: []common.Hash{{}, {}}, } - mockStorage.EXPECT().GetExitRootByGER(mock.Anything, GER, mock.Anything).Return(&exitRoot, nil) + mockStorage.EXPECT().GetL1ExitRootByGER(mock.Anything, GER, mock.Anything).Return(&exitRoot, nil) node := [][]byte{{}, {}} mockStorage.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return(node, nil) smtProof, smtRollupProof, globaExitRoot, err := sut.GetClaimProofbyGER(depositCnt, networkID, GER, nil) diff --git a/synchronizer/interfaces.go b/synchronizer/interfaces.go index 549f75b9..ba80e723 100644 --- a/synchronizer/interfaces.go +++ b/synchronizer/interfaces.go @@ -15,7 +15,6 @@ import ( type ethermanInterface interface { HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) GetRollupInfoByBlockRange(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]etherman.Block, map[common.Hash][]etherman.Order, error) - EthBlockByNumber(ctx context.Context, blockNumber uint64) (*types.Block, error) GetNetworkID() uint32 } @@ -35,9 +34,10 @@ type storageInterface interface { AddTrustedGlobalExitRoot(ctx context.Context, trustedExitRoot *etherman.GlobalExitRoot, dbTx pgx.Tx) (bool, error) GetLatestL1SyncedExitRoot(ctx context.Context, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) CheckIfRootExists(ctx context.Context, root []byte, network uint32, dbTx pgx.Tx) (bool, error) - GetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) + GetL1ExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) GetL2ExitRootsByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) ([]etherman.GlobalExitRoot, error) UpdateL2GER(ctx context.Context, ger etherman.GlobalExitRoot, dbTx pgx.Tx) error + AddRemoveL2GER(ctx context.Context, globalExitRoot etherman.GlobalExitRoot, dbTx pgx.Tx) error } type bridgectrlInterface interface { diff --git a/synchronizer/mock_etherman.go b/synchronizer/mock_etherman.go index 32f6c35c..2cc92027 100644 --- a/synchronizer/mock_etherman.go +++ b/synchronizer/mock_etherman.go @@ -28,65 +28,6 @@ func (_m *ethermanMock) EXPECT() *ethermanMock_Expecter { return ðermanMock_Expecter{mock: &_m.Mock} } -// EthBlockByNumber provides a mock function with given fields: ctx, blockNumber -func (_m *ethermanMock) EthBlockByNumber(ctx context.Context, blockNumber uint64) (*types.Block, error) { - ret := _m.Called(ctx, blockNumber) - - if len(ret) == 0 { - panic("no return value specified for EthBlockByNumber") - } - - var r0 *types.Block - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, uint64) (*types.Block, error)); ok { - return rf(ctx, blockNumber) - } - if rf, ok := ret.Get(0).(func(context.Context, uint64) *types.Block); ok { - r0 = rf(ctx, blockNumber) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Block) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { - r1 = rf(ctx, blockNumber) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// ethermanMock_EthBlockByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EthBlockByNumber' -type ethermanMock_EthBlockByNumber_Call struct { - *mock.Call -} - -// EthBlockByNumber is a helper method to define mock.On call -// - ctx context.Context -// - blockNumber uint64 -func (_e *ethermanMock_Expecter) EthBlockByNumber(ctx interface{}, blockNumber interface{}) *ethermanMock_EthBlockByNumber_Call { - return ðermanMock_EthBlockByNumber_Call{Call: _e.mock.On("EthBlockByNumber", ctx, blockNumber)} -} - -func (_c *ethermanMock_EthBlockByNumber_Call) Run(run func(ctx context.Context, blockNumber uint64)) *ethermanMock_EthBlockByNumber_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64)) - }) - return _c -} - -func (_c *ethermanMock_EthBlockByNumber_Call) Return(_a0 *types.Block, _a1 error) *ethermanMock_EthBlockByNumber_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *ethermanMock_EthBlockByNumber_Call) RunAndReturn(run func(context.Context, uint64) (*types.Block, error)) *ethermanMock_EthBlockByNumber_Call { - _c.Call.Return(run) - return _c -} - // GetNetworkID provides a mock function with given fields: func (_m *ethermanMock) GetNetworkID() uint32 { ret := _m.Called() diff --git a/synchronizer/mock_storage.go b/synchronizer/mock_storage.go index 7f0fee29..22782306 100644 --- a/synchronizer/mock_storage.go +++ b/synchronizer/mock_storage.go @@ -239,6 +239,54 @@ func (_c *storageMock_AddGlobalExitRoot_Call) RunAndReturn(run func(context.Cont return _c } +// AddRemoveL2GER provides a mock function with given fields: ctx, globalExitRoot, dbTx +func (_m *storageMock) AddRemoveL2GER(ctx context.Context, globalExitRoot etherman.GlobalExitRoot, dbTx pgx.Tx) error { + ret := _m.Called(ctx, globalExitRoot, dbTx) + + if len(ret) == 0 { + panic("no return value specified for AddRemoveL2GER") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, etherman.GlobalExitRoot, pgx.Tx) error); ok { + r0 = rf(ctx, globalExitRoot, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// storageMock_AddRemoveL2GER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRemoveL2GER' +type storageMock_AddRemoveL2GER_Call struct { + *mock.Call +} + +// AddRemoveL2GER is a helper method to define mock.On call +// - ctx context.Context +// - globalExitRoot etherman.GlobalExitRoot +// - dbTx pgx.Tx +func (_e *storageMock_Expecter) AddRemoveL2GER(ctx interface{}, globalExitRoot interface{}, dbTx interface{}) *storageMock_AddRemoveL2GER_Call { + return &storageMock_AddRemoveL2GER_Call{Call: _e.mock.On("AddRemoveL2GER", ctx, globalExitRoot, dbTx)} +} + +func (_c *storageMock_AddRemoveL2GER_Call) Run(run func(ctx context.Context, globalExitRoot etherman.GlobalExitRoot, dbTx pgx.Tx)) *storageMock_AddRemoveL2GER_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(etherman.GlobalExitRoot), args[2].(pgx.Tx)) + }) + return _c +} + +func (_c *storageMock_AddRemoveL2GER_Call) Return(_a0 error) *storageMock_AddRemoveL2GER_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *storageMock_AddRemoveL2GER_Call) RunAndReturn(run func(context.Context, etherman.GlobalExitRoot, pgx.Tx) error) *storageMock_AddRemoveL2GER_Call { + _c.Call.Return(run) + return _c +} + // AddTokenWrapped provides a mock function with given fields: ctx, tokenWrapped, dbTx func (_m *storageMock) AddTokenWrapped(ctx context.Context, tokenWrapped *etherman.TokenWrapped, dbTx pgx.Tx) error { ret := _m.Called(ctx, tokenWrapped, dbTx) @@ -509,12 +557,12 @@ func (_c *storageMock_Commit_Call) RunAndReturn(run func(context.Context, pgx.Tx return _c } -// GetExitRootByGER provides a mock function with given fields: ctx, ger, dbTx -func (_m *storageMock) GetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) { +// GetL1ExitRootByGER provides a mock function with given fields: ctx, ger, dbTx +func (_m *storageMock) GetL1ExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (*etherman.GlobalExitRoot, error) { ret := _m.Called(ctx, ger, dbTx) if len(ret) == 0 { - panic("no return value specified for GetExitRootByGER") + panic("no return value specified for GetL1ExitRootByGER") } var r0 *etherman.GlobalExitRoot @@ -539,32 +587,32 @@ func (_m *storageMock) GetExitRootByGER(ctx context.Context, ger common.Hash, db return r0, r1 } -// storageMock_GetExitRootByGER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetExitRootByGER' -type storageMock_GetExitRootByGER_Call struct { +// storageMock_GetL1ExitRootByGER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1ExitRootByGER' +type storageMock_GetL1ExitRootByGER_Call struct { *mock.Call } -// GetExitRootByGER is a helper method to define mock.On call +// GetL1ExitRootByGER is a helper method to define mock.On call // - ctx context.Context // - ger common.Hash // - dbTx pgx.Tx -func (_e *storageMock_Expecter) GetExitRootByGER(ctx interface{}, ger interface{}, dbTx interface{}) *storageMock_GetExitRootByGER_Call { - return &storageMock_GetExitRootByGER_Call{Call: _e.mock.On("GetExitRootByGER", ctx, ger, dbTx)} +func (_e *storageMock_Expecter) GetL1ExitRootByGER(ctx interface{}, ger interface{}, dbTx interface{}) *storageMock_GetL1ExitRootByGER_Call { + return &storageMock_GetL1ExitRootByGER_Call{Call: _e.mock.On("GetL1ExitRootByGER", ctx, ger, dbTx)} } -func (_c *storageMock_GetExitRootByGER_Call) Run(run func(ctx context.Context, ger common.Hash, dbTx pgx.Tx)) *storageMock_GetExitRootByGER_Call { +func (_c *storageMock_GetL1ExitRootByGER_Call) Run(run func(ctx context.Context, ger common.Hash, dbTx pgx.Tx)) *storageMock_GetL1ExitRootByGER_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(common.Hash), args[2].(pgx.Tx)) }) return _c } -func (_c *storageMock_GetExitRootByGER_Call) Return(_a0 *etherman.GlobalExitRoot, _a1 error) *storageMock_GetExitRootByGER_Call { +func (_c *storageMock_GetL1ExitRootByGER_Call) Return(_a0 *etherman.GlobalExitRoot, _a1 error) *storageMock_GetL1ExitRootByGER_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *storageMock_GetExitRootByGER_Call) RunAndReturn(run func(context.Context, common.Hash, pgx.Tx) (*etherman.GlobalExitRoot, error)) *storageMock_GetExitRootByGER_Call { +func (_c *storageMock_GetL1ExitRootByGER_Call) RunAndReturn(run func(context.Context, common.Hash, pgx.Tx) (*etherman.GlobalExitRoot, error)) *storageMock_GetL1ExitRootByGER_Call { _c.Call.Return(run) return _c } diff --git a/synchronizer/synchronizer.go b/synchronizer/synchronizer.go index 0747ac5c..e5af7a9d 100644 --- a/synchronizer/synchronizer.go +++ b/synchronizer/synchronizer.go @@ -417,6 +417,11 @@ func (s *ClientSynchronizer) processBlockRange(blocks []etherman.Block, order ma if err != nil { return err } + case etherman.RemoveL2GEROrder: + err = s.processRemoveL2GlobalExitRoot(blocks[i].RemoveL2GER[element.Pos], blockID, dbTx) + if err != nil { + return err + } case etherman.DepositsOrder: err = s.processDeposit(blocks[i].Deposits[element.Pos], blockID, dbTx) if err != nil { @@ -544,15 +549,15 @@ func (s *ClientSynchronizer) checkReorg(latestStoredBlock, syncedBlock *etherman for { if block == nil { log.Infof("NetworkID: %d, [checkReorg function] Checking Block %d in L1", s.networkID, reorgedBlock.BlockNumber) - b, err := s.etherMan.EthBlockByNumber(s.ctx, reorgedBlock.BlockNumber) + b, err := s.etherMan.HeaderByNumber(s.ctx, new(big.Int).SetUint64(reorgedBlock.BlockNumber)) if err != nil { log.Errorf("networkID: %d, error getting latest block synced from blockchain. Block: %d, error: %v", s.networkID, reorgedBlock.BlockNumber, err) return nil, err } block = ðerman.Block{ - BlockNumber: b.Number().Uint64(), + BlockNumber: b.Number.Uint64(), BlockHash: b.Hash(), - ParentHash: b.ParentHash(), + ParentHash: b.ParentHash, } if block.BlockNumber != reorgedBlock.BlockNumber { err := fmt.Errorf("networkID: %d, wrong ethereum block retrieved from blockchain. Block numbers don't match. BlockNumber stored: %d. BlockNumber retrieved: %d", @@ -703,7 +708,7 @@ func (s *ClientSynchronizer) processGlobalExitRoot(globalExitRoot etherman.Globa } else if len(globalExitRoot.ExitRoots) == 0 { log.Debugf("networkID: %d, Storing L2 Ger: %s", s.networkID, globalExitRoot.GlobalExitRoot) // First read the mainnetExitRoot and rollupsExitRoot to store all the information in the db. - ger, err := s.storage.GetExitRootByGER(s.ctx, globalExitRoot.GlobalExitRoot, nil) + ger, err := s.storage.GetL1ExitRootByGER(s.ctx, globalExitRoot.GlobalExitRoot, nil) if errors.Is(err, gerror.ErrStorageNotFound) { log.Warnf("networkID: %d, L1Ger entry not found in the database. GER: %s", s.networkID, globalExitRoot.GlobalExitRoot.String()) } else if err != nil { @@ -789,7 +794,7 @@ func (s *ClientSynchronizer) processTokenWrapped(tokenWrapped etherman.TokenWrap tokenWrapped.NetworkID = s.networkID err := s.storage.AddTokenWrapped(s.ctx, &tokenWrapped, dbTx) if err != nil { - log.Errorf("networkID: %d, error storing new L1 TokenWrapped in Block: %d, ExitRoot: %+v, err: %v", s.networkID, tokenWrapped.BlockNumber, tokenWrapped, err) + log.Errorf("networkID: %d, error storing new L1 TokenWrapped in Block: %d, TokenWrapped: %+v, err: %v", s.networkID, tokenWrapped.BlockNumber, tokenWrapped, err) rollbackErr := s.storage.Rollback(s.ctx, dbTx) if rollbackErr != nil { log.Errorf("networkID: %d, error rolling back state to store block. BlockNumber: %d, rollbackErr: %v, err: %s", @@ -800,3 +805,20 @@ func (s *ClientSynchronizer) processTokenWrapped(tokenWrapped etherman.TokenWrap } return nil } + +func (s *ClientSynchronizer) processRemoveL2GlobalExitRoot(ger etherman.GlobalExitRoot, blockID uint64, dbTx pgx.Tx) error { + ger.BlockID = blockID + ger.NetworkID = s.networkID + err := s.storage.AddRemoveL2GER(s.ctx, ger, dbTx) + if err != nil { + log.Errorf("networkID: %d, error storing removeL2Ger in Block: %d, GER: %+v, err: %v", s.networkID, ger.BlockNumber, ger, err) + rollbackErr := s.storage.Rollback(s.ctx, dbTx) + if rollbackErr != nil { + log.Errorf("networkID: %d, error rolling back state to store block. BlockNumber: %d, rollbackErr: %v, err: %s", + s.networkID, ger.BlockNumber, rollbackErr, err.Error()) + return rollbackErr + } + return err + } + return nil +} diff --git a/synchronizer/synchronizer_test.go b/synchronizer/synchronizer_test.go index e21f9df1..cd6356f2 100644 --- a/synchronizer/synchronizer_test.go +++ b/synchronizer/synchronizer_test.go @@ -122,8 +122,8 @@ func TestSyncGer(t *testing.T) { Return(lastBlock, nil) m.Etherman. - On("EthBlockByNumber", ctx, lastBlock.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() var n *big.Int @@ -263,8 +263,8 @@ func TestSyncTrustedGer(t *testing.T) { Return(lastBlock, nil) m.Etherman. - On("EthBlockByNumber", ctx, lastBlock.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() var n *big.Int @@ -406,7 +406,7 @@ func TestReorg(t *testing.T) { ethHeader3 := &types.Header{Number: big.NewInt(3), ParentHash: ethBlock2.Hash()} ethBlock3 := types.NewBlockWithHeader(ethHeader3) - lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} + // lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} lastBlock1 := ðerman.Block{BlockHash: ethBlock1.Hash(), BlockNumber: ethBlock1.Number().Uint64(), ParentHash: ethBlock1.ParentHash()} var networkID uint32 = 0 @@ -422,8 +422,8 @@ func TestReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock1.BlockNumber). - Return(ethBlock1, nil). + On("HeaderByNumber", ctx, ethBlock1.Number()). + Return(ethHeader1, nil). Once() ti := time.Date(2024, 1, 1, 1, 0, 0, 0, time.UTC) @@ -466,8 +466,8 @@ func TestReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() m.Storage. @@ -502,8 +502,8 @@ func TestReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() ethermanBlock0 := etherman.Block{ @@ -648,7 +648,7 @@ func TestLatestSyncedBlockEmpty(t *testing.T) { ethHeader3 := &types.Header{Number: big.NewInt(3), ParentHash: ethBlock2.Hash()} ethBlock3 := types.NewBlockWithHeader(ethHeader3) - lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} + // lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} lastBlock1 := ðerman.Block{BlockHash: ethBlock1.Hash(), BlockNumber: ethBlock1.Number().Uint64(), ParentHash: ethBlock1.ParentHash()} var networkID uint32 = 0 @@ -664,8 +664,8 @@ func TestLatestSyncedBlockEmpty(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock1.BlockNumber). - Return(ethBlock1, nil). + On("HeaderByNumber", ctx, ethBlock1.Number()). + Return(ethHeader1, nil). Once() blocks := []etherman.Block{} @@ -695,8 +695,8 @@ func TestLatestSyncedBlockEmpty(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() m.Storage. @@ -731,8 +731,8 @@ func TestLatestSyncedBlockEmpty(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() ethermanBlock0 := etherman.Block{ @@ -810,7 +810,7 @@ func TestRegularReorg(t *testing.T) { ethHeader2 := &types.Header{Number: big.NewInt(2), ParentHash: ethBlock1.Hash()} ethBlock2 := types.NewBlockWithHeader(ethHeader2) - lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} + // lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} lastBlock1 := ðerman.Block{BlockHash: ethBlock1.Hash(), BlockNumber: ethBlock1.Number().Uint64(), ParentHash: ethBlock1.ParentHash()} var networkID uint32 = 0 @@ -826,8 +826,8 @@ func TestRegularReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock1.BlockNumber). - Return(ethBlock1bis, nil). + On("HeaderByNumber", ctx, ethBlock1.Number()). + Return(ethHeader1bis, nil). Once() ti := time.Date(2024, 1, 1, 1, 0, 0, 0, time.UTC) @@ -845,8 +845,8 @@ func TestRegularReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() m.Storage. @@ -881,8 +881,8 @@ func TestRegularReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() ethermanBlock0 := etherman.Block{ @@ -1012,7 +1012,7 @@ func TestLatestSyncedBlockEmptyWithExtraReorg(t *testing.T) { ethHeader0 := &types.Header{Number: big.NewInt(0), ParentHash: parentHash} ethBlock0 := types.NewBlockWithHeader(ethHeader0) ethHeader1bis := &types.Header{Number: big.NewInt(1), ParentHash: ethBlock0.Hash(), Time: 10, GasUsed: 20, Root: common.HexToHash("0x234")} - ethBlock1bis := types.NewBlockWithHeader(ethHeader1bis) + // ethBlock1bis := types.NewBlockWithHeader(ethHeader1bis) ethHeader1 := &types.Header{Number: big.NewInt(1), ParentHash: ethBlock0.Hash()} ethBlock1 := types.NewBlockWithHeader(ethHeader1) ethHeader2 := &types.Header{Number: big.NewInt(2), ParentHash: ethBlock1.Hash()} @@ -1020,8 +1020,8 @@ func TestLatestSyncedBlockEmptyWithExtraReorg(t *testing.T) { ethHeader3 := &types.Header{Number: big.NewInt(3), ParentHash: ethBlock2.Hash()} ethBlock3 := types.NewBlockWithHeader(ethHeader3) - lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} - lastBlock1 := ðerman.Block{BlockHash: ethBlock1.Hash(), BlockNumber: ethBlock1.Number().Uint64(), ParentHash: ethBlock1.ParentHash()} + // lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} + // lastBlock1 := ðerman.Block{BlockHash: ethBlock1.Hash(), BlockNumber: ethBlock1.Number().Uint64(), ParentHash: ethBlock1.ParentHash()} lastBlock2 := ðerman.Block{BlockHash: ethBlock2.Hash(), BlockNumber: ethBlock2.Number().Uint64(), ParentHash: ethBlock2.ParentHash()} var networkID uint32 = 0 @@ -1037,8 +1037,8 @@ func TestLatestSyncedBlockEmptyWithExtraReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock2.BlockNumber). - Return(ethBlock2, nil). + On("HeaderByNumber", ctx, ethBlock2.Number()). + Return(ethHeader2, nil). Once() blocks := []etherman.Block{} @@ -1068,8 +1068,8 @@ func TestLatestSyncedBlockEmptyWithExtraReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock1.BlockNumber). - Return(ethBlock1bis, nil). + On("HeaderByNumber", ctx, ethBlock1.Number()). + Return(ethHeader1bis, nil). Once() stateBlock0 := ðerman.Block{ @@ -1084,8 +1084,8 @@ func TestLatestSyncedBlockEmptyWithExtraReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() m.Storage. @@ -1120,8 +1120,8 @@ func TestLatestSyncedBlockEmptyWithExtraReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() ethermanBlock0 := etherman.Block{ @@ -1226,7 +1226,7 @@ func TestCallFromEmptyBlockAndReorg(t *testing.T) { ethHeader2 := &types.Header{Number: big.NewInt(2), ParentHash: ethBlock1.Hash()} ethBlock2 := types.NewBlockWithHeader(ethHeader2) - lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} + // lastBlock0 := ðerman.Block{BlockHash: ethBlock0.Hash(), BlockNumber: ethBlock0.Number().Uint64(), ParentHash: ethBlock0.ParentHash()} lastBlock1 := ðerman.Block{BlockHash: ethBlock1.Hash(), BlockNumber: ethBlock1.Number().Uint64(), ParentHash: ethBlock1.ParentHash()} var networkID uint32 = 0 @@ -1242,8 +1242,8 @@ func TestCallFromEmptyBlockAndReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock1.BlockNumber). - Return(ethBlock1, nil). + On("HeaderByNumber", ctx, ethBlock1.Number()). + Return(ethHeader1, nil). Once() ti := time.Date(2024, 1, 1, 1, 0, 0, 0, time.UTC) @@ -1286,8 +1286,8 @@ func TestCallFromEmptyBlockAndReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() m.Storage. @@ -1322,8 +1322,8 @@ func TestCallFromEmptyBlockAndReorg(t *testing.T) { Once() m.Etherman. - On("EthBlockByNumber", ctx, lastBlock0.BlockNumber). - Return(ethBlock0, nil). + On("HeaderByNumber", ctx, ethBlock0.Number()). + Return(ethHeader0, nil). Once() blocks = []etherman.Block{ethermanBlock0, ethermanBlock2bis} diff --git a/test/e2e/bridge_sovereign_chain_test.go b/test/e2e/bridge_sovereign_chain_test.go index 72460c42..a194b44b 100644 --- a/test/e2e/bridge_sovereign_chain_test.go +++ b/test/e2e/bridge_sovereign_chain_test.go @@ -14,6 +14,7 @@ import ( "github.com/0xPolygonHermez/zkevm-bridge-service/server" "github.com/0xPolygonHermez/zkevm-bridge-service/test/operations" "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -26,6 +27,7 @@ func TestSovereignChainE2E(t *testing.T) { ctx := context.Background() // rpcURL := "http://localhost:8123" // bridgeAddress := common.HexToAddress("0x71C95911E9a5D330f4D621842EC243EE1343292e") + l2PolygonZkEVMGlobalExitRootAddress := common.HexToAddress("0x712516e61C8B383dF4A63CFe83d7701Bce54B03e") opsCfg := &operations.Config{ L1NetworkURL: "http://localhost:8545", L2NetworkURL: "http://localhost:8123", @@ -147,4 +149,30 @@ func TestSovereignChainE2E(t *testing.T) { // require.True(t, big.NewInt(9000000000000000000).Cmp(balance) > 0) log.Debug("L1-L2 eth bridge end") }) + t.Run("Remove GER bridge", func(t *testing.T) { + // Check globalExitRoot + var networkID uint32 = 1 + globalExitRoot, err := opsman.GetTrustedGlobalExitRootSynced(ctx, networkID) + require.NoError(t, err) + + // Remove GER bridge transaction + err = opsman.RemoveL2GER(ctx, l2PolygonZkEVMGlobalExitRootAddress, []common.Hash{globalExitRoot.GlobalExitRoot}, networkID, operations.L222) + require.NoError(t, err) + + globalExitRoot2, err := opsman.GetTrustedGlobalExitRootSynced(ctx, networkID) + require.NoError(t, err) + require.NotEqual(t, globalExitRoot.ExitRoots[0], globalExitRoot2.ExitRoots[0]) + require.Equal(t, globalExitRoot.ExitRoots[1], globalExitRoot2.ExitRoots[1]) + require.NotEqual(t, globalExitRoot.GlobalExitRoot, globalExitRoot2.GlobalExitRoot) + + // Get Bridge Info By DestAddr + destAddr := common.HexToAddress("0xc949254d682d8c9ad5682521675b8f43b102aec4") + deposits, err := opsman.GetBridgeInfoByDestAddr(ctx, &destAddr) + require.NoError(t, err) + assert.Equal(t, 1, len(deposits)) + assert.Equal(t, false, deposits[0].ReadyForClaim) + assert.Equal(t, "0xC949254d682D8c9ad5682521675b8F43b102aec4", deposits[0].DestAddr) + + log.Debug("Remove GER bridge end") + }) } diff --git a/test/operations/manager.go b/test/operations/manager.go index 7c7a4302..3ca0e45f 100644 --- a/test/operations/manager.go +++ b/test/operations/manager.go @@ -14,13 +14,14 @@ import ( "github.com/0xPolygonHermez/zkevm-bridge-service/db" "github.com/0xPolygonHermez/zkevm-bridge-service/db/pgstorage" "github.com/0xPolygonHermez/zkevm-bridge-service/etherman" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/globalexitrootmanagerl2sovereignchain" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/polygonzkevmbridgev2" "github.com/0xPolygonHermez/zkevm-bridge-service/log" "github.com/0xPolygonHermez/zkevm-bridge-service/server" "github.com/0xPolygonHermez/zkevm-bridge-service/utils" "github.com/0xPolygonHermez/zkevm-bridge-service/utils/gerror" "github.com/0xPolygonHermez/zkevm-node/encoding" erc20 "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/pol" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot" "github.com/0xPolygonHermez/zkevm-node/test/contracts/bin/ERC20" "github.com/0xPolygonHermez/zkevm-node/test/operations" @@ -34,9 +35,10 @@ type NetworkSID string // NetworkSID constants const ( - L1 NetworkSID = "l1" - L2 NetworkSID = "l2" - L22 NetworkSID = "l22" + L1 NetworkSID = "l1" + L2 NetworkSID = "l2" + L22 NetworkSID = "l22" + L222 NetworkSID = "l222" waitRootSyncDeadline = 120 * time.Second ) @@ -59,9 +61,10 @@ const ( ) var accHexPrivateKeys = map[NetworkSID]string{ - L1: "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", //0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC - L2: "0xdfd01798f92667dbf91df722434e8fbe96af0211d4d1b82bbbbc8f1def7a814f", //0xc949254d682d8c9ad5682521675b8f43b102aec4 - L22: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", //0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + L1: "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", //0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC + L2: "0xdfd01798f92667dbf91df722434e8fbe96af0211d4d1b82bbbbc8f1def7a814f", //0xc949254d682d8c9ad5682521675b8f43b102aec4 + L22: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", //0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + L222: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", //0x70997970c51812dc3a010c7d01b50e0d17dc79c8 } // Config is the main Manager configuration. @@ -715,7 +718,7 @@ func (m *Manager) GetLatestGlobalExitRootFromL1(ctx context.Context) (*etherman. // GetCurrentGlobalExitRootFromSmc reads the globalexitroot from the smc func (m *Manager) GetCurrentGlobalExitRootFromSmc(ctx context.Context) (*etherman.GlobalExitRoot, error) { client := m.clients[L1] - br, err := polygonzkevmbridge.NewPolygonzkevmbridge(common.HexToAddress(l1BridgeAddr), client) + br, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(common.HexToAddress(l1BridgeAddr), client) if err != nil { return nil, err } @@ -1020,3 +1023,35 @@ func (m *Manager) SendCustomDeposit(ctx context.Context, rpcURL string, bridgeAd // sync for new exit root return m.WaitExitRootToBeSynced(ctx, orgExitRoot, networkID, destNetwork) } + +func (m *Manager) RemoveL2GER(ctx context.Context, l2GERManagerAddr common.Address, gersToRemove []common.Hash, networkID uint32, l2 NetworkSID) error { + client := m.clients[L2] + auth, err := client.GetSigner(ctx, accHexPrivateKeys[l2]) + if err != nil { + return err + } + gerManager, err := globalexitrootmanagerl2sovereignchain.NewGlobalexitrootmanagerl2sovereignchain(l2GERManagerAddr, client.Client) + if err != nil { + log.Error("error instanciating ger manager. Error: ", err) + return err + } + if len(gersToRemove) == 0 { + return fmt.Errorf("error no gers to remove provided") + } + gersToRemoveAux := [][32]byte{} + for _, ger := range gersToRemove { + gersToRemoveAux = append(gersToRemoveAux, ger) + } + globalExitRoot, err := m.GetTrustedGlobalExitRootSynced(ctx, networkID) + if err != nil { + log.Error("error getting the GlobalExitRoot before sending the tx. Error: ", err) + return err + } + tx, err := gerManager.RemoveLastGlobalExitRoots(auth, gersToRemoveAux) + if err != nil { + log.Error("error removing gers. Error: ", err) + return err + } + log.Info("Remove gers transaction: ", tx.Hash()) + return m.WaitExitRootToBeSynced(ctx, globalExitRoot, 0, networkID) +} diff --git a/test/scripts/deploytool/main.go b/test/scripts/deploytool/main.go index 8caef620..228148d9 100644 --- a/test/scripts/deploytool/main.go +++ b/test/scripts/deploytool/main.go @@ -206,7 +206,7 @@ func deploySovereignChainSMC(ctx *cli.Context) error { log.Error("error: ", err) return err } - _, err = ger.Initialize(auth, auth.From) + _, err = ger.Initialize(auth, auth.From, auth.From) if err != nil { log.Error("error: ", err) return err diff --git a/utils/client.go b/utils/client.go index 7e0f368c..f4bebda5 100644 --- a/utils/client.go +++ b/utils/client.go @@ -12,12 +12,12 @@ import ( "github.com/0xPolygonHermez/zkevm-bridge-service/bridgectrl/pb" "github.com/0xPolygonHermez/zkevm-bridge-service/etherman" + "github.com/0xPolygonHermez/zkevm-bridge-service/etherman/smartcontracts/polygonzkevmbridgev2" "github.com/0xPolygonHermez/zkevm-bridge-service/log" "github.com/0xPolygonHermez/zkevm-bridge-service/test/mocksmartcontracts/BridgeMessageReceiver" "github.com/0xPolygonHermez/zkevm-bridge-service/test/mocksmartcontracts/erc20permitmock" zkevmtypes "github.com/0xPolygonHermez/zkevm-node/config/types" "github.com/0xPolygonHermez/zkevm-node/encoding" - "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmbridge" "github.com/0xPolygonHermez/zkevm-node/etherman/smartcontracts/polygonzkevmglobalexitroot" "github.com/0xPolygonHermez/zkevm-node/test/contracts/bin/ERC20" ops "github.com/0xPolygonHermez/zkevm-node/test/operations" @@ -44,7 +44,7 @@ const ( type Client struct { // Client ethclient *ethclient.Client - Bridge *polygonzkevmbridge.Polygonzkevmbridge + Bridge *polygonzkevmbridgev2.Polygonzkevmbridgev2 BridgeSCAddr common.Address NodeURL string } @@ -55,9 +55,9 @@ func NewClient(ctx context.Context, nodeURL string, bridgeSCAddr common.Address) if err != nil { return nil, err } - var br *polygonzkevmbridge.Polygonzkevmbridge + var br *polygonzkevmbridgev2.Polygonzkevmbridgev2 if bridgeSCAddr != (common.Address{}) { - br, err = polygonzkevmbridge.NewPolygonzkevmbridge(bridgeSCAddr, client) + br, err = polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridgeSCAddr, client) } return &Client{ Client: client, @@ -271,7 +271,7 @@ func (c *Client) SendClaim(ctx context.Context, deposit *pb.Deposit, smtProof [m if deposit.LeafType == uint32(LeafTypeAsset) { tx, err = c.Bridge.ClaimAsset(auth, smtProof, smtRollupProof, globalIndex, globalExitRoot.ExitRoots[0], globalExitRoot.ExitRoots[1], deposit.OrigNet, common.HexToAddress(deposit.OrigAddr), deposit.DestNet, common.HexToAddress(deposit.DestAddr), amount, common.FromHex(deposit.Metadata)) if err != nil { - a, _ := polygonzkevmbridge.PolygonzkevmbridgeMetaData.GetAbi() + a, _ := polygonzkevmbridgev2.Polygonzkevmbridgev2MetaData.GetAbi() input, err3 := a.Pack("claimAsset", smtProof, smtRollupProof, globalIndex, globalExitRoot.ExitRoots[0], globalExitRoot.ExitRoots[1], deposit.OrigNet, common.HexToAddress(deposit.OrigAddr), deposit.DestNet, common.HexToAddress(deposit.DestAddr), amount, common.FromHex(deposit.Metadata)) if err3 != nil { log.Error("error packing call. Error: ", err3) @@ -309,7 +309,7 @@ func WaitTxToBeMined(ctx context.Context, client *ethclient.Client, tx *types.Tr } func (c *Client) GetGlobalExitRootFromSmc(ctx context.Context) (*etherman.GlobalExitRoot, error) { - br, err := polygonzkevmbridge.NewPolygonzkevmbridge(c.BridgeSCAddr, c.Client) + br, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(c.BridgeSCAddr, c.Client) if err != nil { return nil, err }